Java ha un equivalente al range(int, int)metodo di Python ?
Java ha un equivalente al range(int, int)metodo di Python ?
Risposte:
Guava fornisce anche qualcosa di simile a Python range:
Range.closed(1, 5).asSet(DiscreteDomains.integers());
Puoi anche implementare un iteratore abbastanza semplice per fare lo stesso genere di cose usando AbstractIterator di 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#asSetsembra essere diventato obsoleto. Ora devi fare questo:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Vecchia domanda, nuova risposta (per Java 8)
IntStream.range(0, 10).forEach(
n -> {
System.out.println(n);
}
);
o con riferimenti al metodo:
IntStream.range(0, 10).forEach(System.out::println);
A partire da Guava 15.0, Range.asSet () è stato deprecato e dovrebbe essere rimosso nella versione 16. Utilizzare invece quanto segue:
ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
Sto lavorando a una piccola libreria di utilità Java chiamata Jools , e contiene una classe Rangeche fornisce le funzionalità necessarie (c'è un JAR scaricabile).
Costruttori sono o Range(int stop), Range(int start, int stop)o Range(int start, int stop, int step)(simile ad un ciclo for) e potete iterare attraverso di essa, che ha usato la valutazione pigra, oppure si può usare il suo toList()metodo per ottenere l'elenco in modo esplicito gamma.
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;
}
Perdona eventuali errori di sintassi o di stile; Normalmente programma in 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;
}
(Risposta lunga solo per dire "No")
IntStream::iterateDa Java 9 puoi usare IntStream::iteratee puoi persino personalizzare il passaggio. Ad esempio, se vuoi un intarray:
public static int[] getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.toArray();
}
oppure 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());
}
E poi usalo:
int[] range = getInRange(0, 10, 1);
L'elegante classe Range di Groovy può essere utilizzata da Java, anche se non è certamente così piacevole.
La libreria "Functional Java" permette di programmare in questo modo in misura limitata, ha un metodo range () che crea un'istanza fj.data.Array.
Vedere:
Allo stesso modo, la libreria "Totally Lazy" offre un metodo di intervallo pigro: http://code.google.com/p/totallylazy/
Se intendi usarlo come faresti in un ciclo Python, Java funziona bene con l'istruzione for, che rende questa struttura non necessaria a tale scopo.
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());