Java'nın Python range(int, int)yöntemine bir eşdeğeri var mı ?
Java'nın Python range(int, int)yöntemine bir eşdeğeri var mı ?
Yanıtlar:
Guava ayrıca Python'unkine benzer bir şey sağlar range:
Range.closed(1, 5).asSet(DiscreteDomains.integers());
Guava'nın AbstractIterator'ını kullanarak aynı tür şeyleri yapmak için oldukça basit bir yineleyici de uygulayabilirsiniz:
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#asSetkullanımdan kaldırılmış gibi görünüyor. Şimdi bunu yapmanız gerekiyor:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Eski soru, yeni cevap (Java 8 için)
IntStream.range(0, 10).forEach(
n -> {
System.out.println(n);
}
);
veya yöntem referanslarıyla:
IntStream.range(0, 10).forEach(System.out::println);
Guava 15.0'dan beri, Range.asSet () kullanımdan kaldırıldı ve 16 sürümünde kaldırılması planlandı. Bunun yerine aşağıdakileri kullanın:
ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
Jools adında küçük bir Java araçları kitaplığı üzerinde çalışıyorum ve içinde Rangeihtiyacınız olan işlevselliği sağlayan bir sınıf var (indirilebilir bir JAR var).
Yapıcılar ya vardır Range(int stop), Range(int start, int stop)ya da Range(int start, int stop, int step)(döngü için similiar) ve tembel değerlendirme kullanılan hangi içinden ya iterate can veya onun kullanabilirsiniz toList()açıkça aralık listesini almak için yöntem.
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;
}
Sözdizimi veya stil hatalarını affedin; Normalde C # ile programlıyorum.
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;
}
(Sadece "Hayır" demek için uzun cevap)
IntStream::iterateJava 9'dan beri kullanabilir IntStream::iterateve hatta adımı özelleştirebilirsiniz. Örneğin intdizi istiyorsanız :
public static int[] getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.toArray();
}
veya 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());
}
Ve sonra onu kullanın:
int[] range = getInRange(0, 10, 1);
Groovy'nin şık Range sınıfı Java'dan kullanılabilir, ancak kesinlikle o kadar iyi değildir.
"İşlevsel Java" kitaplığı, sınırlı bir dereceye kadar bu şekilde programlamaya izin verir, bir fj.data.Array örneği oluşturan bir range () yöntemine sahiptir.
Görmek:
Benzer şekilde, "Totally Lazy" kitaplığı da geç bir aralık yöntemi sunar: http://code.google.com/p/totallylazy/
Bir Python döngüsünde olduğu gibi kullanmak istiyorsanız, Java, bu yapıyı bu amaç için gereksiz kılan for deyimiyle güzel bir şekilde döngüye girer.
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());