Câu hỏi Java: Tương đương với phạm vi của Python (int, int)?


Java có tương đương với Python không range(int, int) phương pháp?


75
2017-09-24 19:04


gốc


Bạn có nghĩa là một phạm vi Python 2.x mà trả về một danh sách, hoặc một phạm vi Python 3.x mà trả về một iterator (tương đương với 2.x xrange)? Trước đây là tương đối đơn giản để thực hiện như những người khác đã làm dưới đây, nhưng phiên bản iterator là một chút phức tạp hơn. - Dave Kirby
Tôi có nghĩa là một danh sách. - Nick Heiner
stackoverflow.com/questions/16570091/… - zengr
Đối với một phạm vi của bất kỳ Comparable s xem điều này câu trả lời - c0der


Các câu trả lời:


Trái ổi cũng cung cấp một cái gì đó tương tự như của Python range:

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

Bạn cũng có thể thực hiện một iterator khá đơn giản để làm cùng một loại điều sử dụng AbstractIterator của ổi:

return new AbstractIterator<Integer>() {
  int next = getStart();

  @Override protected Integer computeNext() {
    if (isBeyondEnd(next)) {
      return endOfData();
    }
    Integer result = next;
    next = next + getStep();
    return result;
  }
};

22
2017-11-27 17:40



Tôi ước gì tôi đã thấy điều này trước khi tôi thực hiện phạm vi chung của riêng mình. Đó là tốt đẹp nhưng vẫn còn một lời nhắc nhở về cách Java clunky có thể được so sánh với các ngôn ngữ chức năng hơn. - z7sg Ѫ
Range#asSet dường như đã không còn được dùng nữa. Bây giờ bạn cần phải làm điều này: ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers()) - Chthonic Project
những gì thư viện để tôi cần phải nhập khẩu để sử dụng này? - Tyler Gabb


Câu hỏi cũ, câu trả lời mới (cho Java 8)

    IntStream.range(0, 10).forEach(
        n -> {
            System.out.println(n);
        }
    );

hoặc với tham chiếu phương thức:

IntStream.range(0, 10).forEach(System.out::println);

174
2018-04-07 04:00



Gói gì? làm thế nào để nhập nó? - Justin Thomas
@Justin Đó là tính năng ngôn ngữ java 8. - Tzafrir
docs.oracle.com/javase/8/docs/api/java/util/stream/… - jhodges


Tôi đang làm việc trên một thư viện Java utils nhỏ gọi là Joolsvà nó chứa một lớp Range cung cấp chức năng bạn cần (có JAR có thể tải xuống).
Constructors là một trong hai Range(int stop), Range(int start, int stop), hoặc là Range(int start, int stop, int step) (tương tự như vòng lặp for) và bạn có thể lặp qua nó, sử dụng đánh giá lười biếng hoặc bạn có thể sử dụng nó toList() để nhận danh sách phạm vi một cách rõ ràng.

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]

15
2017-09-29 19:01





Từ Guava 15.0, Range.asSet () đã không còn được dùng nữa và được lên kế hoạch xóa trong phiên bản 16. Sử dụng các mục sau để thay thế:

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

15
2017-07-22 03:51





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

Hãy tha thứ cho bất kỳ cú pháp hoặc lỗi kiểu nào; Tôi thường lập trình trong C #.


14
2017-09-24 19:12



cho rằng Vivien Barousse đã đánh bại bạn một câu trả lời, tại sao bạn không xóa câu trả lời của bạn để tránh bất kỳ sự lừa đảo nào. Trừ khi bạn thực sự có kế hoạch độc đáo thịt nó ra khỏi khóa học. - aaronasterling
Chúng giống nhau; Tôi nghĩ rằng tôi là một chút dễ đọc hơn. Việc anh ta sử dụng "chiều dài" là gây hiểu nhầm, và tôi không nghĩ rằng anh ta đáp ứng được đặc tả Python (anh ta bao gồm giới hạn trên, network-theory.co.uk/docs/pytut/rangeFunction.html nói không xảy ra trong Python). Nếu bạn nghĩ một người bị lừa đảo, tôi tin rằng bạn có đủ uy tín để tự mình đối phó với nó. - KeithS


Bạn có thể sử dụng đoạn mã sau để có được tập hợp các số nguyên:

    Set<Integer> iset = IntStream.rangeClosed(1, 5).boxed().collect
            (Collectors.toSet());

7
2018-03-09 17:21





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

(Câu trả lời dài chỉ để nói "Không")


6
2017-09-24 19:10



Ngoài ra, thấy rằng "phạm vi" trong python 3 và "xrange" ưa thích trong Python 2 trả về một đối tượng "sống" không sử dụng hết bộ nhớ cho mỗi mục chứa nó. Điều đó sẽ còn lớn hơn để thực hiện trong Java. - jsbueno


Groovy s tiện lợi Hạng phạm vi có thể được sử dụng từ Java, mặc dù nó chắc chắn không phải là groovy.


2
2018-02-12 23:49





Thư viện "Functional Java" cho phép lập trình theo cách như vậy đến một mức độ hạn chế, nó có một phương thức range () tạo ra một cá thể fj.data.Array.

Xem:

Tương tự, thư viện "Totally Lazy" cung cấp một phương thức phạm vi lười biếng: http://code.google.com/p/totallylazy/


2
2017-09-15 13:24