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


99

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


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;
  }
};

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


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

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]

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 #.


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

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")


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);



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.


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.