Czy Java ma odpowiednik range(int, int)metody Pythona ?
Czy Java ma odpowiednik range(int, int)metody Pythona ?
Odpowiedzi:
Guava zapewnia również coś podobnego do Pythona range:
Range.closed(1, 5).asSet(DiscreteDomains.integers());
Możesz również zaimplementować dość prosty iterator, aby zrobić to samo, używając AbstractIterator Guavy:
return new AbstractIterator<Integer>() {
int next = getStart();
@Override protected Integer computeNext() {
if (isBeyondEnd(next)) {
return endOfData();
}
Integer result = next;
next = next + getStep();
return result;
}
};
Range#asSetwydaje się, że jest przestarzały. Teraz musisz to zrobić:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Stare pytanie, nowa odpowiedź (dla Java 8)
IntStream.range(0, 10).forEach(
n -> {
System.out.println(n);
}
);
lub z odniesieniami do metod:
IntStream.range(0, 10).forEach(System.out::println);
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:
ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
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 : new Range(10)) {...} // i = 0,1,2,3,4,5,6,7,8,9
for (int i : new Range(4,10)) {...} // i = 4,5,6,7,8,9
for (int i : new Range(0,10,2)) {...} // i = 0,2,4,6,8
Range range = new Range(0,10,2);
range.toList(); // [0,2,4,6,8]
public int[] range(int start, int stop)
{
int[] result = new int[stop-start];
for(int i=0;i<stop-start;i++)
result[i] = start+i;
return result;
}
Wybacz wszelkie błędy składniowe lub stylowe; Zwykle programuję w C #.
public int[] range(int start, int length) {
int[] range = new int[length - start + 1];
for (int i = start; i <= length; i++) {
range[i - start] = i;
}
return range;
}
(Długa odpowiedź, wystarczy powiedzieć „Nie”)
IntStream::iterateOd wersji Java 9 możesz używać, IntStream::iteratea nawet dostosowywać krok. Na przykład, jeśli chcesz mieć inttablicę:
public static int[] getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.toArray();
}
lub List:
public static List<Integer> getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.boxed()
.collect(Collectors.toList());
}
A następnie użyj go:
int[] range = getInRange(0, 10, 1);
Sprytną klasę Range Groovy można używać w Javie, choć z pewnością nie jest tak fajna.
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/
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.
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());