Java: Setara dengan range Python (int, int)?

99

Apakah Java memiliki persamaan dengan range(int, int)metode Python ?

Nick Heiner
sumber
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.
Dave Kirby
Untuk kisaran apa saja Comparable, lihat jawaban ini
c0der
Untuk rentang dengan melangkah, lihat ini
Sławomir Lenart

Jawaban:

27

Guava juga menyediakan sesuatu yang mirip dengan Python range:

Range.closed(1, 5).asSet(DiscreteDomains.integers());

Anda juga bisa menerapkan iterator yang cukup sederhana untuk melakukan hal yang sama menggunakan 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;
  }
};
Simon Steele
sumber
6
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);
        }
    );

atau dengan referensi metode:

IntStream.range(0, 10).forEach(System.out::println);
jhodges
sumber
1
Paket apa? bagaimana cara mengimpornya?
Justin Thomas
6
@Justin Itulah fitur bahasa java 8.
Tzafrir
16

Sejak Guava 15.0, Range.asSet () tidak lagi digunakan dan dijadwalkan untuk dihapus di versi 16. Gunakan yang berikut ini sebagai gantinya:

ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
jiehanzheng
sumber
15

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 : 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]
Amir Rachum
sumber
14
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;
}

Maafkan sintaks atau kesalahan gaya; Saya biasanya memprogram dalam C #.

KeithS
sumber
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:

    Set<Integer> iset = IntStream.rangeClosed(1, 5).boxed().collect
            (Collectors.toSet());
Julian
sumber
7
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;
}

(Jawaban panjang hanya untuk mengatakan "Tidak")

Vivien Barousse
sumber
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.
jsbueno
3

Jawa 9 - IntStream::iterate

Sejak Java 9 Anda dapat menggunakan IntStream::iteratedan Anda bahkan dapat menyesuaikan langkahnya. Misalnya jika Anda menginginkan intarray:

public static int[] getInRange(final int min, final int max, final int step) {
    return IntStream.iterate(min, i -> i < max, i -> i + step)
            .toArray();
}

atau 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());
}

Dan kemudian gunakan:

int[] range = getInRange(0, 10, 1);
michalk
sumber
2

Kelas Range Groovy yang bagus dapat digunakan dari Java, meskipun tidak terlalu asyik.

John
sumber
1

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.

Nikki9696
sumber
5
Anda juga biasanya tidak menggunakannya untuk loop dengan python. Hampir selalu ada cara yang lebih bersih untuk mengulang.
Daenyth
Nah, range biasanya digunakan dalam for loop. Tetapi untuk loop sering digunakan tanpa jangkauan.
FogleBird
1
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());
Pierre
sumber
1
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:

Stream.iterate(start, n -> n + 1).limit(stop);

start - stop inklusif - eksklusif

HDubz
sumber