Voulez-vous dire une plage Python 2.x qui renvoie une liste, ou une plage Python 3.x qui renvoie un itérateur (équivalent à la plage x 2.x)? La première est relativement simple à implémenter comme d'autres l'ont fait ci-dessous, mais la version itérateur est un peu plus délicate.
J'aurais aimé voir cela avant de mettre en place ma propre gamme générique. C'est bien mais c'est encore un autre rappel de la façon dont Java maladroit peut être comparé à des langages plus fonctionnels.
z7sg Ѫ
14
Range#asSetCela semble être devenu obsolète. Vous devez maintenant faire ceci:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Chthonic Project
quelle bibliothèque dois-je importer pour l'utiliser?
tgabb
À partir de Java 8, IntStream et LongStream ont des méthodes range et rangeClosed.
Jose Manuel Gomez Alvarez
225
Ancienne question, nouvelle réponse (pour Java 8)
IntStream.range(0,10).forEach(
n ->{System.out.println(n);});
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 :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]
étant donné que Vivien Barousse vous a battu à une réponse, pourquoi ne supprimez-vous pas la vôtre pour éviter toute duperie. À moins que vous ne prévoyiez vraiment de l'étoffer bien, bien sûr.
aaronasterling
9
Ils sont similaires; Je pense que le mien est un peu plus lisible. Son utilisation de la "longueur" est trompeuse, et je ne pense pas que la sienne réponde à la spécification Python (il inclut la borne supérieure, ce que network-theory.co.uk/docs/pytut/rangeFunction.html dit ne se produit pas en Python ). Si vous pensez que l'on est dupe, je pense que vous avez une réputation suffisante pour y faire face vous-même.
KeithS
10
Vous pouvez utiliser l'extrait de code suivant pour obtenir un ensemble de plages d'entiers:
Aussi, voyez que "range" en python 3 et le "xrange" préféré en Python 2 renvoient un objet "live" qui n'utilise pas de mémoire pour chaque élément qu'il contient. Ce serait encore plus gros à implémenter en Java.
Depuis Java 9, vous pouvez utiliser IntStream::iterateet vous pouvez même personnaliser l'étape. Par exemple, si vous voulez un inttableau:
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());}
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.
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.
Cela vous aiderait si vous expliquiez comment ce code résout le problème.
Robert Columbia
0
Je sais que c'est un ancien article, mais si vous recherchez une solution qui renvoie un flux d'objets et que vous ne voulez ou ne pouvez pas utiliser de dépendances supplémentaires:
Comparable
s, voir cette réponseRéponses:
Guava fournit également quelque chose de similaire à celui de Python
range
:Vous pouvez également implémenter un itérateur assez simple pour faire le même genre de chose en utilisant AbstractIterator de Guava:
la source
Range#asSet
Cela 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)
ou avec des références de méthode:
la source
Depuis Guava 15.0, Range.asSet () est obsolète et devrait être supprimé dans la version 16. Utilisez plutôt ce qui suit:
la source
Je travaille sur une petite bibliothèque d'utils Java appelée Jools , et elle contient une classe
Range
qui 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)
ouRange(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 latoList()
méthode pour obtenir explicitement la liste de gamme.la source
Pardonnez toute erreur de syntaxe ou de style; Je programme normalement en C #.
la source
Vous pouvez utiliser l'extrait de code suivant pour obtenir un ensemble de plages d'entiers:
la source
(Longue réponse juste pour dire "non")
la source
Java 9 -
IntStream::iterate
Depuis Java 9, vous pouvez utiliser
IntStream::iterate
et vous pouvez même personnaliser l'étape. Par exemple, si vous voulez unint
tableau:ou
List
:Et puis utilisez-le:
la source
La classe Range de Groovy peut être utilisée à partir de Java, bien qu'elle ne soit certainement pas aussi groovy.
la source
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/
la source
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.
la source
la source
Je sais que c'est un ancien article, mais si vous recherchez une solution qui renvoie un flux d'objets et que vous ne voulez ou ne pouvez pas utiliser de dépendances supplémentaires:
start - stop inclus - exclusif
la source