2010-08-02 22 views
18

Czy jest jakaś składnia/pakiet umożliwiający szybkie wypełnianie tablic java zakresami liczb, jak w perlu?Wypełnij tablice z zakresami liczb

np.

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

Ponadto, jest tu pakiet, który umożliwia uzyskanie liczby n-ty w takiej listy numerów jak wyżej, bez konieczności tworzenia tablicy (co może mieć ogromny)?

np.

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 

To nie jest zbyt trudne do wykonania, ale myślę, że to może być wspólne, więc może to już było zrobione.

+0

Lub po prostu użyj Groovy ;-) 'def arr = (1..500) + (301..400) + (1001..1400)' – Nux

Odpowiedz

8

Nie tak czysty, jak odpowiedź prawdziwy miękki, ale można użyć Google Guava z tym samym skutkiem:

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

} 

Zauważ, że potrzebujesz kilku statycznych importów, aby to zadziałało.

+1

Nawet jeśli jest to bardziej szczegółowe, to jest o wiele jaśniejsze niż podejście dolara. –

+0

Nie sądzę, aby statyczne importowanie było bardzo czyste. Wolałbym niestandardowe wdrożenie niż to zrobić. –

+0

@Erick "Nie sądzę, aby statyczne importowanie było bardzo czyste." Można oczywiście używać w pełni kwalifikowanych nazw metod, jednak użycie statycznych importów powoduje, że kod jest mniej szczegółowy. –

17

Jest 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 !! Nigdy tego nie widziałem! Nigdy ... A to jest Java. Interesujące ... –

+2

Czy jest dostępny jako zależność od maven? Nie mogę znaleźć czegoś takiego ... – f1sh

+0

Nie mogę znaleźć czegoś takiego. Jest to ważne tylko w Javie, jeśli samodzielnie zdefiniujesz metodę $. –

8

chodzi o pierwsze pytanie, czy możliwe jest, aby wypełnić macierz z wartościami w zakresie: jest to w ogóle możliwe, aby osiągnąć z kombinacją Range, DiscreteDomain, ContiguousSet i Ints z Guava:

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

I nie jest to dokładnie to, co jest wymienione w drugiej części pytania, ale jest możliwe, aby stworzyć zestaw z elementami szeregu dyskretnych domeny:

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

Powstały Set nie będzie zawierać określone elementy fizycznie, tylko logicznie (tak to zużycie pamięci będzie mały), ale można powtórzyć (ponieważ jest to Set):

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

Nice .. nic o tym nie wiedziałem. –

59

Dla tych, którzy jeszcze szukają rozwiązania :

W języku Java 8 lub nowszym można na nie odpowiedzieć w sposób trywialny za pomocą strumieni bez żadnych pętli lub dodatkowych bibliotek.

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

pokaże się tablicę z liczb całkowitych od 1 do 10.

Bardziej ogólne rozwiązanie daje taki sam wynik jest poniżej. Można to zrobić, aby utworzyć dowolną sekwencję, modyfikując operatora jednoargumentowego.

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

// oprócz Jaką odpowiedź craig jeśli chcesz mieć Integer 2nd approch

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

Innym użytecznym i nie znana Java 8 rozwiązanie dla istniejących tablic:

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