Java tem um equivalente ao range(int, int)método do Python ?
Java tem um equivalente ao range(int, int)método do Python ?
Respostas:
O Guava também fornece algo semelhante ao do Python range:
Range.closed(1, 5).asSet(DiscreteDomains.integers());
Você também pode implementar um iterador bastante simples para fazer o mesmo tipo de coisa usando AbstractIterator do 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#asSetparece ter se tornado obsoleto. Agora você precisa fazer isso:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Pergunta antiga, nova resposta (para Java 8)
IntStream.range(0, 10).forEach(
n -> {
System.out.println(n);
}
);
ou com referências de método:
IntStream.range(0, 10).forEach(System.out::println);
Desde o Guava 15.0, Range.asSet () se tornou obsoleto e está programado para ser removido na versão 16. Use o seguinte:
ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
Estou trabalhando em uma pequena biblioteca de utilitários Java chamada Jools , e ela contém uma classe Rangeque fornece a funcionalidade de que você precisa (há um JAR para download).
Construtores são ou Range(int stop), Range(int start, int stop)ou Range(int start, int stop, int step)(semelhante a um loop) e você pode iterate através dele, que costumava avaliação preguiçosa, ou você pode usar o seu toList()método para obter explicitamente a lista de gama.
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;
}
Perdoe quaisquer erros de sintaxe ou estilo; Eu normalmente programo em 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;
}
(Resposta longa apenas para dizer "Não")
IntStream::iterateDesde o Java 9 você pode usar IntStream::iteratee até personalizar a etapa. Por exemplo, se você deseja 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();
}
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());
}
E então use-o:
int[] range = getInRange(0, 10, 1);
A elegante classe Range do Groovy pode ser usada em Java, embora certamente não seja tão legal.
A biblioteca "Functional Java" permite programar de forma limitada, possui um método range () criando uma instância fj.data.Array.
Vejo:
Da mesma forma, a biblioteca "Totally Lazy" oferece um método de intervalo lento: http://code.google.com/p/totallylazy/
Se você pretende usá-lo como faria em um loop Python, o Java executa um loop bem com a instrução for, o que torna essa estrutura desnecessária para esse propósito.
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());