Você quer dizer um intervalo Python 2.x que retorna uma lista ou um intervalo Python 3.x que retorna um iterador (equivalente a 2.x xrange)? O primeiro é relativamente simples de implementar, como outros fizeram abaixo, mas a versão do iterador é um pouco mais complicada.
Eu gostaria de ter visto isso antes de implementar minha própria linha genérica. É bom, mas ainda outro lembrete de como o Java desajeitado pode ser comparado a linguagens mais funcionais.
z7sg Ѫ
14
Range#asSetparece ter se tornado obsoleto. Agora você precisa fazer isso:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Projeto Chthonic
que biblioteca preciso importar para usar isso?
tgabb
No Java 8, IntStream e LongStream têm os métodos range e rangeClosed.
Jose Manuel Gomez Alvarez
225
Pergunta antiga, nova resposta (para Java 8)
IntStream.range(0,10).forEach(
n ->{System.out.println(n);});
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 :newRange(10)){...}// i = 0,1,2,3,4,5,6,7,8,9for(int i :newRange(4,10)){...}// i = 4,5,6,7,8,9for(int i :newRange(0,10,2)){...}// i = 0,2,4,6,8Range range =newRange(0,10,2);
range.toList();// [0,2,4,6,8]
dado que Vivien Barousse chegou antes de você, por que não deleta a sua para evitar qualquer engano. A menos que você realmente planeje aprimorá-lo, é claro.
aaronasterling
9
Eles são semelhantes; Acho que o meu é um pouco mais legível. Seu uso de "comprimento" é enganoso e não acho que ele atenda às especificações do Python (ele inclui o limite superior, que network-theory.co.uk/docs/pytut/rangeFunction.html diz que não acontece no Python ) Se você acha que alguém é um ingênuo, acredito que tem reputação suficiente para lidar com isso sozinho.
KeithS
10
Você pode usar o seguinte snippet de código para obter um conjunto de intervalo de inteiros:
Além disso, veja que "range" em Python 3 e o "xrange" preferido em Python 2 retornam um objeto "live" que não usa memória para cada item que contém. Isso seria ainda maior para implementar em Java.
Desde o Java 9 você pode usar IntStream::iteratee até personalizar a etapa. Por exemplo, se você deseja intarray:
publicstaticint[] getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).toArray();}
ou List:
publicstaticList<Integer> getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).boxed().collect(Collectors.toList());}
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.
Ajudaria se você explicasse como esse código resolve o problema.
Robert Columbia
0
Eu sei que esta é uma postagem antiga, mas se você está procurando uma solução que retorna um fluxo de objeto e não deseja ou não pode usar nenhuma dependência adicional:
Comparable
s, veja esta respostaRespostas:
O Guava também fornece algo semelhante ao do Python
range
:Você também pode implementar um iterador bastante simples para fazer o mesmo tipo de coisa usando AbstractIterator do Guava:
fonte
Range#asSet
parece ter se tornado obsoleto. Agora você precisa fazer isso:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Pergunta antiga, nova resposta (para Java 8)
ou com referências de método:
fonte
Desde o Guava 15.0, Range.asSet () se tornou obsoleto e está programado para ser removido na versão 16. Use o seguinte:
fonte
Estou trabalhando em uma pequena biblioteca de utilitários Java chamada Jools , e ela contém uma classe
Range
que fornece a funcionalidade de que você precisa (há um JAR para download).Construtores são ou
Range(int stop)
,Range(int start, int stop)
ouRange(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 seutoList()
método para obter explicitamente a lista de gama.fonte
Perdoe quaisquer erros de sintaxe ou estilo; Eu normalmente programo em C #.
fonte
Você pode usar o seguinte snippet de código para obter um conjunto de intervalo de inteiros:
fonte
(Resposta longa apenas para dizer "Não")
fonte
Java 9 -
IntStream::iterate
Desde o Java 9 você pode usar
IntStream::iterate
e até personalizar a etapa. Por exemplo, se você desejaint
array:ou
List
:E então use-o:
fonte
A elegante classe Range do Groovy pode ser usada em Java, embora certamente não seja tão legal.
fonte
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/
fonte
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.
fonte
fonte
Eu sei que esta é uma postagem antiga, mas se você está procurando uma solução que retorna um fluxo de objeto e não deseja ou não pode usar nenhuma dependência adicional:
início - parada inclusiva - exclusivo
fonte