88

Java có tương đương với range(int, int)phương thức của Python không?

|
24

Quả ổ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ể triển khai một trình vòng lặp khá đơn giản để thực hiện cùng một thứ bằng cách sử dụng Tóm tắt Trình biên dịch của 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;
  }
};
|
  • 1

    Tôi ước tôi đã nhìn 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. Thật hay nhưng vẫn là một lời nhắc nhở khác về cách Java có thể được so sánh với các ngôn ngữ chức năng hơn.

    – Hồ Quốc Hải 19:09:41 27/11/2012
  • 1

    Range#asSetdường như đã trở nên phản đối Bây giờ bạn cần phải làm điều này:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())

    – Lý Thu Minh 22:50:02 26/12/2013
  • 1

    Tôi cần nhập thư viện nào để sử dụng?

    – Phạm Xuân Quý 20:41:30 24/09/2017
  • 1

    Từ Java 8, IntStream và LongStream có phạm vi phương thức và phạm vi.

    – Bùi Nhật Duy 22:51:20 19/12/2018
194

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 các tham chiếu phương thức:

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

Kể từ Guava 15.0, Range.asSet () đã không được chấp nhận và được lên lịch để xóa trong phiên bản 16. Thay vào đó, hãy sử dụng cách sau:

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

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

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

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

|
  • 1

    cho rằng Vivien Barousse đánh bại bạn để trả lời, tại sao bạn không xóa của bạn để tránh bất kỳ bản sao 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.

    – Hồ Quốc Hải 19:24:06 24/09/2010
  • 1

    Chúng giống nhau; Tôi nghĩ rằng tôi dễ đọc hơn một chút. Việc sử dụng "độ dài" của anh ta là sai lệch và tôi không nghĩ rằng anh ta đáp ứng thông số Python (anh ta bao gồm giới hạn trên, mà mạng-theory.co.uk/docs/pytut/rangeFunction.html nói rằng không xảy ra trong Python ). Nếu bạn nghĩ ai đó là kẻ lừa bịp, tôi tin rằng bạn có đủ uy tín để tự mình giải quyết.

    – Lý Thu Minh 20:06:55 24/09/2010
8

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

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

|
  • 1

    Ngoài ra, hãy xem "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 mà nó chứa. Điều đó sẽ còn lớn hơn để thực hiện trong Java.

    – Hồ Quốc Hải 00:58:57 25/09/2010
2

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

Xem:

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

|
2

Lớp Range tiện lợi của Groovy có thể được sử dụng từ Java, mặc dù nó chắc chắn không phải là Groovy .

|
1

Nếu bạn có ý định sử dụng nó như bạn làm trong một vòng lặp Python, thì Java lặp lại độc đáo với câu lệnh for, điều này làm cho cấu trúc này không cần thiết cho mục đích đó.

|
  • 1

    Bạn cũng không thường sử dụng nó cho một vòng lặp trong python. Hầu như luôn luôn có một cách sạch hơn để lặp đi lặp lại.

    – Hồ Quốc Hải 19:16:51 24/09/2010
  • 1

    Vâng, phạm vi thường được sử dụng trong một vòng lặp for. Nhưng đối với các vòng lặp thường được sử dụng mà không có phạm vi.

    – Lý Thu Minh 20:14:48 24/09/2010

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.