Apakah yang Anda maksud adalah rentang Python 2.x yang mengembalikan daftar, atau rentang Python 3.x yang mengembalikan iterator (setara dengan 2.x xrange)? Yang pertama relatif sederhana untuk diimplementasikan seperti yang dilakukan orang lain di bawah ini, tetapi versi iteratornya sedikit lebih rumit.
Saya berharap saya telah melihat ini sebelum saya menerapkan jangkauan generik saya sendiri. Ini bagus tetapi masih merupakan pengingat lain tentang bagaimana Java yang kikuk dapat dibandingkan dengan bahasa yang lebih fungsional.
z7sg Ѫ
14
Range#asSettampaknya sudah usang. Anda sekarang perlu melakukan ini:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Chthonic Project
perpustakaan apa yang perlu saya impor untuk menggunakan ini?
tgabb
Dari Java 8, IntStream dan LongStream memiliki metode range dan rangeClosed.
Jose Manuel Gomez Alvarez
225
Pertanyaan lama, jawaban baru (untuk Java 8)
IntStream.range(0,10).forEach(
n ->{System.out.println(n);});
Saya sedang mengerjakan pustaka Java utils kecil bernama Jools , dan itu berisi kelas Rangeyang menyediakan fungsionalitas yang Anda butuhkan (ada JAR yang dapat diunduh).
Konstruktor adalah salah satu Range(int stop),, Range(int start, int stop)atau Range(int start, int stop, int step)(mirip dengan loop for) dan Anda dapat mengulanginya, yang menggunakan evaluasi malas, atau Anda dapat menggunakan toList()metodenya untuk mendapatkan daftar rentang secara eksplisit.
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]
mengingat bahwa Vivien Barousse mengalahkan Anda untuk sebuah jawaban, mengapa Anda tidak menghapus milik Anda untuk menghindari dup. Kecuali jika Anda benar-benar berencana untuk menyempurnakannya tentu saja.
aaronasterling
9
Mereka serupa; Saya pikir milik saya sedikit lebih mudah dibaca. Penggunaannya atas "length" menyesatkan, dan menurut saya dia tidak memenuhi spesifikasi Python (dia menyertakan batas atas, yang dikatakan network-theory.co.uk/docs/pytut/rangeFunction.html tidak terjadi di Python ). Jika menurut Anda seseorang adalah penipu, saya yakin Anda memiliki reputasi yang cukup untuk menghadapinya sendiri.
KeithS
10
Anda dapat menggunakan cuplikan kode berikut untuk mendapatkan sekumpulan bilangan bulat:
Juga, lihat bahwa "range" di python 3 dan "xrange" yang disukai di Python 2 mengembalikan objek "live" yang tidak menggunakan memori untuk setiap item di dalamnya. Itu akan lebih besar lagi untuk diterapkan di Java.
Sejak Java 9 Anda dapat menggunakan IntStream::iteratedan Anda bahkan dapat menyesuaikan langkahnya. Misalnya jika Anda menginginkan intarray:
publicstaticint[] getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).toArray();}
atau List:
publicstaticList<Integer> getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).boxed().collect(Collectors.toList());}
Pustaka "Java Fungsional" memungkinkan untuk memprogram sedemikian rupa hingga tingkat yang terbatas, ia memiliki metode range () yang membuat turunan fj.data.Array.
Jika Anda bermaksud menggunakannya seperti yang Anda lakukan dalam perulangan Python, Java melakukan loop dengan baik dengan pernyataan for, yang membuat struktur ini tidak diperlukan untuk tujuan itu.
Ini akan membantu jika Anda menjelaskan bagaimana kode ini menyelesaikan masalah.
Robert Columbia
0
Saya tahu ini adalah posting lama tetapi jika Anda mencari solusi yang mengembalikan aliran objek dan tidak ingin atau tidak dapat menggunakan dependensi tambahan:
Comparable
, lihat jawaban iniJawaban:
Guava juga menyediakan sesuatu yang mirip dengan Python
range
:Anda juga bisa menerapkan iterator yang cukup sederhana untuk melakukan hal yang sama menggunakan AbstractIterator Guava:
sumber
Range#asSet
tampaknya sudah usang. Anda sekarang perlu melakukan ini:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Pertanyaan lama, jawaban baru (untuk Java 8)
atau dengan referensi metode:
sumber
Sejak Guava 15.0, Range.asSet () tidak lagi digunakan dan dijadwalkan untuk dihapus di versi 16. Gunakan yang berikut ini sebagai gantinya:
sumber
Saya sedang mengerjakan pustaka Java utils kecil bernama Jools , dan itu berisi kelas
Range
yang menyediakan fungsionalitas yang Anda butuhkan (ada JAR yang dapat diunduh).Konstruktor adalah salah satu
Range(int stop)
,,Range(int start, int stop)
atauRange(int start, int stop, int step)
(mirip dengan loop for) dan Anda dapat mengulanginya, yang menggunakan evaluasi malas, atau Anda dapat menggunakantoList()
metodenya untuk mendapatkan daftar rentang secara eksplisit.sumber
Maafkan sintaks atau kesalahan gaya; Saya biasanya memprogram dalam C #.
sumber
Anda dapat menggunakan cuplikan kode berikut untuk mendapatkan sekumpulan bilangan bulat:
sumber
(Jawaban panjang hanya untuk mengatakan "Tidak")
sumber
Jawa 9 -
IntStream::iterate
Sejak Java 9 Anda dapat menggunakan
IntStream::iterate
dan Anda bahkan dapat menyesuaikan langkahnya. Misalnya jika Anda menginginkanint
array:atau
List
:Dan kemudian gunakan:
sumber
Kelas Range Groovy yang bagus dapat digunakan dari Java, meskipun tidak terlalu asyik.
sumber
Pustaka "Java Fungsional" memungkinkan untuk memprogram sedemikian rupa hingga tingkat yang terbatas, ia memiliki metode range () yang membuat turunan fj.data.Array.
Lihat:
Demikian pula, pustaka "Benar-benar Malas" menawarkan metode rentang malas: http://code.google.com/p/totallylazy/
sumber
Jika Anda bermaksud menggunakannya seperti yang Anda lakukan dalam perulangan Python, Java melakukan loop dengan baik dengan pernyataan for, yang membuat struktur ini tidak diperlukan untuk tujuan itu.
sumber
sumber
Saya tahu ini adalah posting lama tetapi jika Anda mencari solusi yang mengembalikan aliran objek dan tidak ingin atau tidak dapat menggunakan dependensi tambahan:
start - stop inklusif - eksklusif
sumber