2010-08-02 18 views
18

¿Hay alguna sintaxis/paquete que permita el llenado rápido de arreglos Java con rangos de números, como en perl?Llene matrices con rangos de números

p. Ej.

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

Además, desde aquí un paquete que permite obtener el número enésimo en dicha lista de números que el anterior, sin llegar a crear la matriz (que puede ser enorme)?

p. Ej.

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 

No es demasiado difícil de implementar, pero supongo que podría ser común, así que tal vez ya estaba hecho.

+0

O simplemente use Groovy ;-) 'def arr = (1..500) + (301..400) + (1001..1400)' – Nux

Respuesta

8

No es tan limpia como la respuesta de verdadera suave, pero se puede usar Google Guava en el mismo sentido:

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

} 

Tenga en cuenta que necesita algunas importaciones estáticas para que esto funcione.

+1

Incluso si es más detallado, eso es mucho más claro que el enfoque del dólar. –

+0

No creo que las importaciones estáticas sean muy limpias. Preferiría una implementación personalizada que hacer esto. –

+0

@Erick "No creo que las importaciones estáticas sean muy limpias". Por supuesto, puede utilizar los nombres de métodos completamente calificados, sin embargo, al usar las importaciones estáticas, el código es menos detallado. –

17

Hay dollar:

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

experto:

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

Whoow !! Nunca he visto esto antes! Nunca ... Y esto es Java. Interesante ... –

+2

¿Está disponible como una dependencia de maven? No puedo encontrar nada como eso. – f1sh

+0

No puedo encontrar nada como esto tampoco. Esto solo es válido en Java si usted mismo define el método $. –

8

En cuanto a la primera pregunta, si es posible para llenar una matriz con los valores de un rango: en realidad es posible lograr que con la combinación de Range, DiscreteDomain, ContiguousSet y Ints de Guava:

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

Y, no es exactamente lo que se menciona en la segunda parte de la pregunta, pero es posible crear un conjunto con los elementos de un rango de un dominio discreto:

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

El resultado Set no contendrá los elementos especificados físicamente, solamente lógicamente (por lo que es huella de memoria será pequeño), pero puede repetirse (ya que es un Set):

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

Niza ... no lo sabía. –

59

Para aquellos que todavía buscan una solución :

En Java 8 o posterior, esto se puede responder trivialmente utilizando Streams sin bucles o bibliotecas adicionales.

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

Esto producirá una matriz con los números enteros de 1 a 10.

una solución más general que produce el mismo resultado es a continuación. Esto puede hacerse para producir cualquier secuencia modificando el operador unario.

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

// además de lo que Craig respuesta si usted quiere tener Entero segundo approch

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

Otra solución útil y no es muy conocida en Java 8 para las matrices existentes:

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