2010-08-02 7 views
18

Existe-t-il une syntaxe/un package permettant de remplir rapidement des tableaux java avec des plages de nombres, comme dans Perl?Remplir des tableaux avec des plages de nombres

par exemple.

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

En outre, ici un package qui permet d'obtenir le numéro de n-ième dans cette liste des numéros que ci-dessus, sans réellement créer le tableau (qui peut être énorme)?

par exemple.

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 

Ce n'est pas trop difficile à implémenter, mais je suppose que c'est peut-être courant, alors peut-être que c'était déjà fait.

+0

Ou utilisez simplement Groovy ;-) 'def arr = (1..500) + (301..400) + (1001..1400)' – Nux

Répondre

8

Pas tout à fait aussi propre que la réponse True douce, mais vous pouvez utiliser Google Guava dans le même sens:

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

} 

Notez que vous avez besoin de quelques importations statiques pour que cela fonctionne.

+1

Même si plus verbeux, c'est beaucoup plus clair que l'approche du dollar. –

+0

Je ne pense pas que les importations statiques soient très propres. Je préférerais une implémentation personnalisée que de le faire. –

+0

@Erick "Je ne pense pas que les importations statiques soient très propres." Vous pouvez bien sûr utiliser les noms de méthodes entièrement qualifiés, mais l'utilisation des importations statiques rend le code moins détaillé. –

17

Il est 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 !! Je n'ai jamais vu ça avant! Jamais ... Et c'est Java. Intéressant ... –

+2

Est-il disponible en tant que dépendance maven? Je ne peux pas trouver quelque chose comme ça .. – f1sh

+0

Je ne peux pas trouver quelque chose comme ça non plus. Ceci n'est valable qu'en Java si vous définissez vous-même la méthode $. –

8

En ce qui concerne la première question, s'il est possible de remplir un tableau avec les valeurs d'une plage: il est en fait possible d'y parvenir avec la combinaison de Range, DiscreteDomain, ContiguousSet et Ints de Guava:

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

Et, pas exactement ce qui est mentionné dans la deuxième partie de la question, mais il est possible de créer un ensemble avec les éléments d'une gamme d'un domaine discret:

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

Le résultat Set ne contiendra pas les éléments spécifiés physiquement, seulement logiquement (il est donc empreinte mémoire sera faible), mais peut itérer (car il est un Set):

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

Nice .. ne savait pas à ce sujet. –

59

Pour ceux qui cherchent toujours une solution :

En Java 8 ou version ultérieure, il est possible de répondre trivialement à l'aide de Streams sans boucles ou bibliothèques supplémentaires.

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

Ceci produira un tableau avec les nombres entiers de 1 à 10.

Une solution plus générale qui produit le même résultat est ci-dessous. Cela peut être fait pour produire n'importe quelle séquence en modifiant l'opérateur unaire.

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

// en plus de quelle réponse craig si vous voulez avoir entier 2ème approch

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

Une autre solution Java 8 utile et pas largement connus pour les tableaux existants:

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