¿Te refieres a un rango de Python 2.x que devuelve una lista, o un rango de Python 3.x que devuelve un iterador (equivalente al rango x 2.x)? El primero es relativamente simple de implementar como otros lo han hecho a continuación, pero la versión del iterador es un poco más complicada.
Ojalá hubiera visto esto antes de implementar mi propia gama genérica. Es agradable, pero es otro recordatorio de lo torpe que se puede comparar Java con lenguajes más funcionales.
z7sg Ѫ
14
Range#asSetParece que ha quedado obsoleto. Ahora necesita hacer esto:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Proyecto Chthonic
¿Qué biblioteca necesito importar para usar esto?
tgabb
Desde Java 8, IntStream y LongStream tienen métodos range y rangeClosed.
Jose Manuel Gomez Alvarez
225
Pregunta anterior, nueva respuesta (para Java 8)
IntStream.range(0,10).forEach(
n ->{System.out.println(n);});
Estoy trabajando en una pequeña biblioteca de utilidades de Java llamada Jools , y contiene una clase Rangeque proporciona la funcionalidad que necesita (hay un JAR descargable).
Los constructores son o bien Range(int stop), Range(int start, int stop)o Range(int start, int stop, int step)(similar a un bucle for) y usted puede iterar a través de él, el cual utiliza la evaluación perezosa, o puede utilizar su toList()método para obtener explícitamente la lista de rangos.
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 se adelantó a una respuesta, ¿por qué no borra la suya para evitar duplicidades? A menos que realmente planees desarrollarlo bien, por supuesto.
aaronasterling
9
Son similares; Creo que el mío es un poco más legible. Su uso de "longitud" es engañoso, y no creo que cumpla con las especificaciones de Python (incluye el límite superior, que network-theory.co.uk/docs/pytut/rangeFunction.html dice que no ocurre en Python ). Si cree que uno es un engañado, creo que tiene la reputación suficiente para enfrentarse a él.
KeithS
10
Puede utilizar el siguiente fragmento de código para obtener un conjunto de rangos de enteros:
Además, vea que "rango" en Python 3 y el "xrange" preferido en Python 2 devuelven un objeto "en vivo" que no usa memoria para cada elemento que contiene. Eso sería aún más grande de implementar en Java.
Desde Java 9 puedes usar IntStream::iteratee incluso puedes personalizar el paso. Por ejemplo, si quieres una intmatriz:
publicstaticint[] getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).toArray();}
o bien List:
publicstaticList<Integer> getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).boxed().collect(Collectors.toList());}
Si tiene la intención de usarlo como lo haría en un bucle de Python, Java funciona bien con la instrucción for, lo que hace que esta estructura sea innecesaria para ese propósito.
Sería útil si explicaras cómo este código resuelve el problema.
Robert Columbia
0
Sé que esta es una publicación antigua, pero si está buscando una solución que devuelva un flujo de objetos y no quiere o no puede usar ninguna dependencia adicional:
Comparable
s, vea esta respuestaRespuestas:
Guava también proporciona algo similar a Python
range
:También puede implementar un iterador bastante simple para hacer el mismo tipo de cosas usando el AbstractIterator de Guava:
fuente
Range#asSet
Parece que ha quedado obsoleto. Ahora necesita hacer esto:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Pregunta anterior, nueva respuesta (para Java 8)
o con referencias de métodos:
fuente
Desde Guava 15.0, Range.asSet () ha quedado obsoleto y está programado para ser eliminado en la versión 16. Utilice lo siguiente en su lugar:
fuente
Estoy trabajando en una pequeña biblioteca de utilidades de Java llamada Jools , y contiene una clase
Range
que proporciona la funcionalidad que necesita (hay un JAR descargable).Los constructores son o bien
Range(int stop)
,Range(int start, int stop)
oRange(int start, int stop, int step)
(similar a un bucle for) y usted puede iterar a través de él, el cual utiliza la evaluación perezosa, o puede utilizar sutoList()
método para obtener explícitamente la lista de rangos.fuente
Perdone cualquier error de sintaxis o estilo; Normalmente programo en C #.
fuente
Puede utilizar el siguiente fragmento de código para obtener un conjunto de rangos de enteros:
fuente
(Respuesta larga solo para decir "No")
fuente
Java 9 -
IntStream::iterate
Desde Java 9 puedes usar
IntStream::iterate
e incluso puedes personalizar el paso. Por ejemplo, si quieres unaint
matriz:o bien
List
:Y luego úsalo:
fuente
La ingeniosa clase Range de Groovy se puede usar desde Java, aunque ciertamente no es tan maravillosa.
fuente
La biblioteca "Functional Java" permite programar de tal manera hasta un grado limitado, tiene un método range () creando una instancia fj.data.Array.
Ver:
De manera similar, la biblioteca "Totally Lazy" ofrece un método de rango perezoso: http://code.google.com/p/totallylazy/
fuente
Si tiene la intención de usarlo como lo haría en un bucle de Python, Java funciona bien con la instrucción for, lo que hace que esta estructura sea innecesaria para ese propósito.
fuente
fuente
Sé que esta es una publicación antigua, pero si está buscando una solución que devuelva un flujo de objetos y no quiere o no puede usar ninguna dependencia adicional:
inicio - incluido parada - exclusivo
fuente