2010-08-02 24 views
18

Có cú pháp/gói nào cho phép điền nhanh các mảng java với các dải số, như trong perl không?Điền các mảng có dải số

ví dụ:

int[] arr = new int[1000]; 
arr=(1..500,301..400,1001..1400); // returns [1,2,3,4,...,500,301,302,...,400,1001,1002,...1400] 

Ngoài ra, nó ở đây một gói cho phép nhận số thứ n trong danh sách số như trên, mà không thực sự tạo mảng (có thể lớn)?

ví dụ:

BunchOfRangesType bort = new BunchOfRangesType("1..500","301..400","1001..1400"); 
bort.get(0); // return 1 
bort.get(500); // return 301 
bort.get(501); // return 302 

Nó không quá khó để thực hiện, nhưng tôi đoán nó có thể là phổ biến vì vậy có thể nó đã được thực hiện.

+0

Hoặc chỉ sử dụng Groovy ;-) 'def arr = (1..500) + (301..400) + (1001..1400)' – Nux

Trả lời

8

Không hẳn như sạch sẽ là câu trả lời thật mềm, nhưng bạn có thể sử dụng Google Guava để tác dụng tương tự:

public class Test { 

    public static void main(String[] args) { 
     //one liner 
     int[] array = toArray(newLinkedList(concat(range(1, 10), range(500, 1000)))); 

     //more readable 
     Iterable<Integer> values = concat(range(1, 10), range(500, 1000)); 
     List<Integer> list = newLinkedList(values); 
     int[] array = toArray(list); 

    } 

    public static List<Integer> range(int min, int max) { 
     List<Integer> list = newLinkedList(); 
     for (int i = min; i <= max; i++) { 
      list.add(i); 
     } 

     return list; 
    } 

} 

Lưu ý rằng bạn cần một vài lần nhập tĩnh để làm việc này.

+1

Thậm chí nếu tiết lộ nhiều hơn, điều đó rõ ràng hơn nhiều so với cách tiếp cận đồng đô la. –

+0

Tôi không nghĩ rằng nhập khẩu tĩnh là rất sạch sẽ. Tôi muốn thực hiện tùy chỉnh hơn là thực hiện việc này. –

+0

@Erick "Tôi không nghĩ rằng nhập khẩu tĩnh là rất sạch sẽ." Tất nhiên, bạn có thể sử dụng tên phương thức đầy đủ, tuy nhiên việc sử dụng nhập tĩnh sẽ làm cho đoạn mã ít tiết hơn. –

17

dollar:

// build the List 10, 11, 12, 13, 14 
List<Integer> list2 = $(10, 15).toList(); 

maven:

<dependency> 
     <groupId>org.bitbucket.dollar</groupId> 
     <artifactId>dollar</artifactId> 
     <version>1.0-beta3</version> 
</dependency> 
+0

Whoow !! Chưa bao giờ thấy điều này trước đây! Không bao giờ ... Và đây là Java. Thú vị ... –

+2

Nó có sẵn dưới dạng phụ thuộc của maven không? Tôi không thể tìm thấy bất cứ điều gì như thế .. – f1sh

+0

Tôi không thể tìm thấy bất cứ điều gì như thế này. Điều này chỉ hợp lệ trong Java nếu bạn định nghĩa chính phương thức $. –

8

Đối với câu hỏi đầu tiên, cho dù nó có thể điền vào một mảng với các giá trị của một loạt: nó thực sự có thể đạt được điều đó với sự kết hợp của Range, DiscreteDomain, ContiguousSetInts từ Guava:

int[] array = Ints.toArray(
    ContiguousSet.create(Range.closed(1, 500), DiscreteDomain.integers())); 

Và, không phải chính xác những gì được đề cập trong phần thứ hai của câu hỏi, nhưng nó có thể để tạo ra một thiết lập với các yếu tố của một phạm vi của một miền rời rạc:

Set<Integer> numbersFrom1To500 = 
    ContiguousSet.create(Range.closed(1, 500), DiscreteDomain.integers()); 

Các kết quả Set sẽ không chứa các yếu tố quy định về thể chất, chỉ logic (do đó, nó nhớ dấu chân sẽ nhỏ), nhưng có thể được lặp (vì nó là một Set):

for (Integer integer : numbersFrom1To500) { 
    System.out.println(integer); 
} 
+0

Đẹp .. không biết về điều đó. –

59

Đối với những người vẫn đang tìm kiếm một giải pháp :

Trong Java 8 trở lên, điều này có thể được trả lời một cách đáng kể bằng cách sử dụng Luồng không có bất kỳ vòng lặp hoặc thư viện bổ sung nào.

int[] range = IntStream.rangeClosed(1, 10).toArray(); 

Điều này sẽ tạo ra một mảng với các số nguyên từ 1 đến 10

Một giải pháp tổng quát hơn mà tạo ra kết quả tương tự dưới đây. Điều này có thể được thực hiện để tạo ra bất kỳ chuỗi nào bằng cách sửa đổi toán tử đơn nhất.

int[] range = IntStream.iterate(1, n -> n + 1).limit(10).toArray(); 
1
List<Integer> arrayOfRange = new ArrayList<Integer>(); 
    int[] range = IntStream.iterate(1, n -> {arrayOfRange.add(n);return n + 1;}).limit(10).toArray(); 

// thêm vào những gì craig câu trả lời nếu bạn muốn có Integer 2 approch

List<Integer> list = IntStream.of(range).boxed().collect(Collectors.toList()); 
2

Một giải pháp hữu ích và không biết đến rộng rãi Java 8 cho mảng hiện có:

int[] array = new int[10]; 
Arrays.setAll(array, i -> i + 1); 
Các vấn đề liên quan