Czy masz na myśli zakres Pythona 2.x, który zwraca listę, czy zakres Pythona 3.x, który zwraca iterator (odpowiednik 2.x xrange)? Pierwsza z nich jest stosunkowo prosta do zaimplementowania, tak jak inne zrobiły to poniżej, ale wersja iteratora jest nieco bardziej skomplikowana.
Żałuję, że nie widziałem tego, zanim wdrożyłem mój własny ogólny zakres. To fajne, ale to kolejne przypomnienie, jak niezgrabną Javę można porównać do bardziej funkcjonalnych języków.
z7sg Ѫ
14
Range#asSetwydaje się, że jest przestarzały. Teraz musisz to zrobić:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Projekt Chthonic
jaką bibliotekę muszę zaimportować, aby z tego skorzystać?
tgabb
Od Java 8, IntStream i LongStream mają metody range i rangeClosed.
Jose Manuel Gomez Alvarez,
225
Stare pytanie, nowa odpowiedź (dla Java 8)
IntStream.range(0,10).forEach(
n ->{System.out.println(n);});
Pracuję nad małą biblioteką narzędzi Java o nazwie Jools , która zawiera klasę, Rangektóra zapewnia potrzebną funkcjonalność (jest JAR do pobrania).
Konstruktorami są albo Range(int stop), Range(int start, int stop)albo Range(int start, int stop, int step)(podobnie jak pętla for) i możesz albo iterować po niej, która używa leniwej oceny, albo możesz użyć jej toList()metody, aby jawnie uzyskać listę zakresów.
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]
biorąc pod uwagę, że Vivien Barousse pokonała cię w odpowiedzi, dlaczego nie usuniesz swojej, aby uniknąć jakiegokolwiek oszustwa. Chyba że naprawdę planujesz ładnie go ukształtować.
aaronasterling
9
Są podobne; Myślę, że moje jest trochę bardziej czytelne. Użycie przez niego „length” jest mylące i nie sądzę, aby spełniał on specyfikację Pythona (zawiera górną granicę, o której network-theory.co.uk/docs/pytut/rangeFunction.html mówi, że nie występuje w Pythonie ). Jeśli uważasz, że jesteś naiwniakiem, sądzę, że masz wystarczającą reputację, aby sobie z tym poradzić.
KeithS
10
Możesz użyć następującego fragmentu kodu, aby uzyskać zestaw liczb całkowitych z zakresu:
Zobacz również, że „zakres” w Pythonie 3 i preferowany „xrange” w Pythonie 2 zwracają „aktywny” obiekt, który nie zużywa pamięci dla każdego elementu, który zawiera. To byłoby jeszcze większe do zaimplementowania w Javie.
Od wersji Java 9 możesz używać, IntStream::iteratea nawet dostosowywać krok. Na przykład, jeśli chcesz mieć inttablicę:
publicstaticint[] getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).toArray();}
lub List:
publicstaticList<Integer> getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).boxed().collect(Collectors.toList());}
Jeśli zamierzasz używać go tak, jak w pętli Pythona, Java ładnie zapętla się z instrukcją for, co sprawia, że ta struktura jest niepotrzebna do tego celu.
Comparable
znaleźć w tej odpowiedziOdpowiedzi:
Guava zapewnia również coś podobnego do Pythona
range
:Możesz również zaimplementować dość prosty iterator, aby zrobić to samo, używając AbstractIterator Guavy:
źródło
Range#asSet
wydaje się, że jest przestarzały. Teraz musisz to zrobić:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Stare pytanie, nowa odpowiedź (dla Java 8)
lub z odniesieniami do metod:
źródło
Od wersji Guava 15.0 funkcja Range.asSet () jest przestarzała i jest planowana do usunięcia w wersji 16. Zamiast tego użyj następującego:
źródło
Pracuję nad małą biblioteką narzędzi Java o nazwie Jools , która zawiera klasę,
Range
która zapewnia potrzebną funkcjonalność (jest JAR do pobrania).Konstruktorami są albo
Range(int stop)
,Range(int start, int stop)
alboRange(int start, int stop, int step)
(podobnie jak pętla for) i możesz albo iterować po niej, która używa leniwej oceny, albo możesz użyć jejtoList()
metody, aby jawnie uzyskać listę zakresów.źródło
Wybacz wszelkie błędy składniowe lub stylowe; Zwykle programuję w C #.
źródło
Możesz użyć następującego fragmentu kodu, aby uzyskać zestaw liczb całkowitych z zakresu:
źródło
(Długa odpowiedź, wystarczy powiedzieć „Nie”)
źródło
Java 9 -
IntStream::iterate
Od wersji Java 9 możesz używać,
IntStream::iterate
a nawet dostosowywać krok. Na przykład, jeśli chcesz miećint
tablicę:lub
List
:A następnie użyj go:
źródło
Sprytną klasę Range Groovy można używać w Javie, choć z pewnością nie jest tak fajna.
źródło
Biblioteka „Functional Java” pozwala w ograniczonym stopniu na programowanie, posiada metodę range () tworzącą instancję fj.data.Array.
Widzieć:
Podobnie biblioteka „Totally Lazy” oferuje metodę leniwego zakresu: http://code.google.com/p/totallylazy/
źródło
Jeśli zamierzasz używać go tak, jak w pętli Pythona, Java ładnie zapętla się z instrukcją for, co sprawia, że ta struktura jest niepotrzebna do tego celu.
źródło
źródło
Wiem, że to stary post, ale jeśli szukasz rozwiązania, które zwraca strumień obiektów i nie chcesz lub nie możesz użyć żadnych dodatkowych zależności:
start - włącznie stop - ekskluzywny
źródło