2010-08-02 107 views
18

是否有任何語法/包允許用數組範圍快速填充java數組,如在perl中?用數組範圍填充數組

例如

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

另外,這裏的軟件包,其允許獲得在數字作爲上述這樣的列表中的第n號,而不實際創建陣列(其可以是巨大的)?

例如

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 

這不難實現,但我想這可能是常見的,所以也許它已經完成。

+0

或者只是使用Groovy ;-)'def arr =(1..500)+(301..400)+(1001..1400)' – Nux 2017-02-14 12:12:04

回答

8

不太一樣乾淨真正的軟的答案,但你可以使用Google Guava達到同樣的效果:

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

} 

請注意,您需要一些靜態導入才能工作。

+1

即使更詳細,這比美元方法要清楚得多。 – 2010-08-02 12:28:12

+0

我不認爲靜態進口是非常乾淨的。我更喜歡自定義實現,而不是這樣做。 – 2010-08-02 13:12:48

+0

@Erick「我認爲靜態進口不是很乾淨。」您當然可以使用完全限定的方法名稱,但使用靜態導入確實可以使代碼更加冗長。 – 2010-08-02 14:03:20

17

dollar

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

行家:

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

哇!以前從未見過!永遠不......這是Java。有趣的... – 2010-08-02 11:55:56

+2

它是否可用作maven依賴項?我找不到像這樣的東西.. – f1sh 2010-08-02 12:11:18

+0

我找不到像這樣的東西。如果您自己定義$方法,這僅在Java中有效。 – 2010-08-02 13:10:38

8

對於第一個問題,無論是能夠填充的陣列具有一定範圍的值:它實際上是可能實現與RangeDiscreteDomainContiguousSetIntsGuava組合:

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

而且,不正是在這個問題的第二部分提到,但也可以創建一組具有一系列離散域的元素:

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

所得Set將不包含指定的元素物理地,僅在邏輯上(所以它的內存佔用將是小的),但可以重複(因爲它是一個Set):

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

不錯。不知道。 – 2015-02-16 23:11:03

59

對於仍然尋找一個解決方案:

在Java 8或更高版本中,可以使用不帶任何循環或附加庫的Streams進行簡單回答。

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

這將產生具有從1個整數的數組至10

產生相同的結果是以下的更通用的解決方案。這可以通過修改一元運算符來產生任何序列。

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

//除了什麼克雷格的答案,如果你想擁有整數 第二計算策略

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

現有陣列另一個有用的,而不是廣爲人知的Java 8的解決方案:

int[] array = new int[10]; 
Arrays.setAll(array, i -> i + 1);