Java มีคุณสมบัติเทียบเท่ากับrange(int, int)เมธอดของ Python หรือไม่?
Java มีคุณสมบัติเทียบเท่ากับrange(int, int)เมธอดของ Python หรือไม่?
คำตอบ:
Guavaยังให้สิ่งที่คล้ายกับ Python range:
Range.closed(1, 5).asSet(DiscreteDomains.integers());
คุณยังสามารถใช้ iterator ที่ค่อนข้างง่ายเพื่อทำสิ่งเดียวกันโดยใช้ AbstractIterator ของ Guava:
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#asSetดูเหมือนว่าจะเลิกใช้แล้ว ตอนนี้คุณต้องทำสิ่งนี้:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
คำถามเก่าคำตอบใหม่ (สำหรับ Java 8)
IntStream.range(0, 10).forEach(
n -> {
System.out.println(n);
}
);
หรือด้วยการอ้างอิงวิธีการ:
IntStream.range(0, 10).forEach(System.out::println);
ฉันกำลังทำงานกับไลบรารียูทิลิตี้ Java ชื่อJoolsและมีคลาสRangeที่ให้ฟังก์ชันที่คุณต้องการ (มี JAR ที่ดาวน์โหลดได้)
ก่อสร้างมีทั้งRange(int stop), Range(int start, int stop)หรือRange(int start, int stop, int step)(คล้ายกับการวน) และคุณสามารถย้ำผ่านมันซึ่งใช้ในการประเมินผลขี้เกียจหรือคุณสามารถใช้มันtoList()วิธีการที่จะได้รับรายชื่ออย่างชัดเจนช่วง
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]
ตั้งแต่ Guava 15.0, Range.asSet ()ได้เลิกใช้งานและมีกำหนดจะลบออกในเวอร์ชัน 16 ใช้สิ่งต่อไปนี้แทน:
ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
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;
}
ยกโทษให้ข้อผิดพลาดทางไวยากรณ์หรือรูปแบบ ปกติฉันตั้งโปรแกรมใน C #
คุณสามารถใช้ข้อมูลโค้ดต่อไปนี้เพื่อรับชุดจำนวนเต็มช่วง:
Set<Integer> iset = IntStream.rangeClosed(1, 5).boxed().collect
(Collectors.toSet());
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;
}
(ตอบยาวแค่ว่า "ไม่")
IntStream::iterateตั้งแต่ Java 9 คุณสามารถใช้IntStream::iterateและคุณสามารถปรับแต่งขั้นตอนได้ ตัวอย่างเช่นหากคุณต้องการintอาร์เรย์:
public static int[] getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.toArray();
}
หรือ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());
}
แล้วใช้มัน:
int[] range = getInRange(0, 10, 1);
คลาสช่วงที่ดีของ Groovy สามารถใช้งานได้จาก Java แม้ว่าจะไม่สะดวกสบายเท่า
ไลบรารี "Functional Java" อนุญาตให้เขียนโปรแกรมในลักษณะที่ จำกัด ได้โดยมีวิธี range () ที่สร้างอินสแตนซ์ fj.data.Array
ดู:
ในทำนองเดียวกันห้องสมุด "Totally Lazy" มีวิธีการช่วงขี้เกียจ: http://code.google.com/p/totallylazy/
หากคุณต้องการใช้มันเหมือนที่คุณทำในลูป Python Java จะวนซ้ำกับคำสั่ง for ซึ่งทำให้โครงสร้างนี้ไม่จำเป็นสำหรับจุดประสงค์นั้น
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่หากคุณกำลังมองหาวิธีแก้ปัญหาที่ส่งคืนสตรีมวัตถุและไม่ต้องการหรือไม่สามารถใช้การอ้างอิงเพิ่มเติมใด ๆ :
Stream.iterate(start, n -> n + 1).limit(stop);
เริ่ม - หยุดรวม - พิเศษ