Meinen Sie einen Python 2.x-Bereich, der eine Liste zurückgibt, oder einen Python 3.x-Bereich, der einen Iterator zurückgibt (entspricht dem 2.x xrange)? Ersteres ist relativ einfach zu implementieren, wie andere unten beschrieben haben, aber die Iteratorversion ist etwas kniffliger.
Ich wünschte, ich hätte dies gesehen, bevor ich mein eigenes generisches Sortiment implementiert habe. Es ist schön, aber noch eine weitere Erinnerung daran, wie klobig Java mit funktionaleren Sprachen verglichen werden kann.
z7sg Ѫ
14
Range#asSetes scheint veraltet zu sein. Sie müssen dies jetzt tun:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Chthonic Project
Welche Bibliothek muss ich importieren, um dies zu verwenden?
Tgabb
Ab Java 8 haben IntStream und LongStream die Methoden range und rangeClosed.
Jose Manuel Gomez Alvarez
225
Alte Frage, neue Antwort (für Java 8)
IntStream.range(0,10).forEach(
n ->{System.out.println(n);});
Ich arbeite an einer kleinen Java-Utils-Bibliothek namens Jools , die eine Klasse enthält, Rangedie die von Ihnen benötigte Funktionalität bietet (es gibt eine herunterladbare JAR).
Konstruktoren sind entweder Range(int stop), Range(int start, int stop)oder Range(int start, int stop, int step)(ähnlich einer for-Schleife), und Sie können sie entweder durchlaufen, wobei eine verzögerte Auswertung verwendet wurde, oder Sie können ihre toList()Methode verwenden, um die Bereichsliste explizit abzurufen.
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]
Angesichts der Tatsache, dass Vivien Barousse Sie zu einer Antwort geschlagen hat, warum löschen Sie Ihre nicht, um Dup zu vermeiden? Es sei denn, Sie planen wirklich, es natürlich schön zu fleischen.
Aaronasterling
9
Sie sind ähnlich; Ich denke, meine ist etwas besser lesbar. Seine Verwendung von "Länge" ist irreführend, und ich glaube nicht, dass er die Python-Spezifikation erfüllt (er enthält die Obergrenze, die laut network-theory.co.uk/docs/pytut/rangeFunction.html in Python nicht vorkommt ). Wenn Sie denken, dass jemand ein Betrüger ist, glaube ich, dass Sie einen ausreichenden Ruf haben, um sich selbst darum zu kümmern.
KeithS
10
Sie können das folgende Codefragment verwenden, um einen Bereichssatz von Ganzzahlen abzurufen:
Beachten Sie auch, dass "range" in Python 3 und der bevorzugte "xrange" in Python 2 ein "live" -Objekt zurückgeben, das nicht für jedes darin enthaltene Element Speicher belegt. Das wäre noch größer in Java zu implementieren.
Seit Java 9 können IntStream::iterateSie den Schritt verwenden und sogar anpassen. Zum Beispiel, wenn Sie intArray wollen :
publicstaticint[] getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).toArray();}
oder List:
publicstaticList<Integer> getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).boxed().collect(Collectors.toList());}
Die Bibliothek "Functional Java" ermöglicht ein begrenztes Programmieren. Sie verfügt über eine range () -Methode, mit der eine fj.data.Array-Instanz erstellt wird.
Wenn Sie es wie in einer Python-Schleife verwenden möchten, führt Java eine gute Schleife mit der for-Anweisung durch, wodurch diese Struktur für diesen Zweck unnötig wird.
Es wäre hilfreich, wenn Sie erklären würden, wie dieser Code das Problem löst.
Robert Columbia
0
Ich weiß, dass dies ein alter Beitrag ist, aber wenn Sie nach einer Lösung suchen, die einen Objektstrom zurückgibt und keine zusätzlichen Abhängigkeiten verwenden möchte oder kann:
Comparable
s siehe diese AntwortAntworten:
Guave bietet auch etwas Ähnliches wie Python
range
:Sie können auch einen ziemlich einfachen Iterator implementieren, um dasselbe mit Guavas AbstractIterator zu tun:
quelle
Range#asSet
es scheint veraltet zu sein. Sie müssen dies jetzt tun:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Alte Frage, neue Antwort (für Java 8)
oder mit Methodenreferenzen:
quelle
Seit Guava 15.0 ist Range.asSet () veraltet und soll in Version 16 entfernt werden. Verwenden Sie stattdessen Folgendes:
quelle
Ich arbeite an einer kleinen Java-Utils-Bibliothek namens Jools , die eine Klasse enthält,
Range
die die von Ihnen benötigte Funktionalität bietet (es gibt eine herunterladbare JAR).Konstruktoren sind entweder
Range(int stop)
,Range(int start, int stop)
oderRange(int start, int stop, int step)
(ähnlich einer for-Schleife), und Sie können sie entweder durchlaufen, wobei eine verzögerte Auswertung verwendet wurde, oder Sie können ihretoList()
Methode verwenden, um die Bereichsliste explizit abzurufen.quelle
Verzeihen Sie Syntax- oder Stilfehler. Normalerweise programmiere ich in C #.
quelle
Sie können das folgende Codefragment verwenden, um einen Bereichssatz von Ganzzahlen abzurufen:
quelle
(Lange Antwort, nur um "Nein" zu sagen)
quelle
Java 9 -
IntStream::iterate
Seit Java 9 können
IntStream::iterate
Sie den Schritt verwenden und sogar anpassen. Zum Beispiel, wenn Sieint
Array wollen :oder
List
:Und dann benutze es:
quelle
Groovys raffinierte Range-Klasse kann von Java aus verwendet werden, obwohl sie sicherlich nicht so groovig ist.
quelle
Die Bibliothek "Functional Java" ermöglicht ein begrenztes Programmieren. Sie verfügt über eine range () -Methode, mit der eine fj.data.Array-Instanz erstellt wird.
Sehen:
In ähnlicher Weise bietet die Bibliothek "Totally Lazy" eine Lazy Range-Methode: http://code.google.com/p/totallylazy/
quelle
Wenn Sie es wie in einer Python-Schleife verwenden möchten, führt Java eine gute Schleife mit der for-Anweisung durch, wodurch diese Struktur für diesen Zweck unnötig wird.
quelle
quelle
Ich weiß, dass dies ein alter Beitrag ist, aber wenn Sie nach einer Lösung suchen, die einen Objektstrom zurückgibt und keine zusätzlichen Abhängigkeiten verwenden möchte oder kann:
Start - inklusive Stopp - exklusiv
quelle