Java a-t-il un équivalent à la range(int, int)méthode de Python ?
Java a-t-il un équivalent à la range(int, int)méthode de Python ?
Réponses:
Guava fournit également quelque chose de similaire à celui de Python range:
Range.closed(1, 5).asSet(DiscreteDomains.integers());
Vous pouvez également implémenter un itérateur assez simple pour faire le même genre de chose en utilisant AbstractIterator de Guava:
return new AbstractIterator<Integer>() {
int next = getStart();
@Override protected Integer computeNext() {
if (isBeyondEnd(next)) {
return endOfData();
}
Integer result = next;
next = next + getStep();
return result;
}
};
Range#asSetCela semble être devenu obsolète. Vous devez maintenant faire ceci:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Ancienne question, nouvelle réponse (pour Java 8)
IntStream.range(0, 10).forEach(
n -> {
System.out.println(n);
}
);
ou avec des références de méthode:
IntStream.range(0, 10).forEach(System.out::println);
Depuis Guava 15.0, Range.asSet () est obsolète et devrait être supprimé dans la version 16. Utilisez plutôt ce qui suit:
ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
Je travaille sur une petite bibliothèque d'utils Java appelée Jools , et elle contient une classe Rangequi fournit les fonctionnalités dont vous avez besoin (il y a un JAR téléchargeable).
Les constructeurs sont soit Range(int stop), Range(int start, int stop)ou Range(int start, int stop, int step)(similaire à une boucle) et vous pouvez itérer à travers elle, qui a utilisé l' évaluation paresseuse, ou vous pouvez utiliser la toList()méthode pour obtenir explicitement la liste de gamme.
for (int i : new Range(10)) {...} // i = 0,1,2,3,4,5,6,7,8,9
for (int i : new Range(4,10)) {...} // i = 4,5,6,7,8,9
for (int i : new Range(0,10,2)) {...} // i = 0,2,4,6,8
Range range = new Range(0,10,2);
range.toList(); // [0,2,4,6,8]
public int[] range(int start, int stop)
{
int[] result = new int[stop-start];
for(int i=0;i<stop-start;i++)
result[i] = start+i;
return result;
}
Pardonnez toute erreur de syntaxe ou de style; Je programme normalement en C #.
public int[] range(int start, int length) {
int[] range = new int[length - start + 1];
for (int i = start; i <= length; i++) {
range[i - start] = i;
}
return range;
}
(Longue réponse juste pour dire "non")
IntStream::iterateDepuis Java 9, vous pouvez utiliser IntStream::iterateet vous pouvez même personnaliser l'étape. Par exemple, si vous voulez un inttableau:
public static int[] getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.toArray();
}
ou List:
public static List<Integer> getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.boxed()
.collect(Collectors.toList());
}
Et puis utilisez-le:
int[] range = getInRange(0, 10, 1);
La classe Range de Groovy peut être utilisée à partir de Java, bien qu'elle ne soit certainement pas aussi groovy.
La librairie "Functional Java" permet de programmer de telle manière à un degré limité, elle dispose d'une méthode range () créant une instance fj.data.Array.
Voir:
De même, la bibliothèque "Totally Lazy" propose une méthode de plage différée: http://code.google.com/p/totallylazy/
Si vous avez l'intention de l'utiliser comme vous le feriez dans une boucle Python, Java boucle bien avec l'instruction for, ce qui rend cette structure inutile à cette fin.
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());