2013-04-15 12 views
22

C'è qualcosa di così veloce in Java? (Rapido nella codifica)Il modo più semplice per riempire un array con 1,2 ... n

int [] a = {1..99}; 

o devo andare per questo:

int [] a=new int[100]; 
for (int i=0;i <100;++i){ 
a[i]=i; 
} 
+7

È necessario il ciclo Ho paura ... – assylias

+0

possibile duplicato http: // StackOverflow.it/questions/9128737/modo più veloce per impostare tutti i valori di un array –

+0

Dai un'occhiata a questa domanda: http://stackoverflow.com/questions/3790142/java-equivalent-of-pythons -rangeint-int –

risposta

12

Per curiosità, ho provato le prestazioni di due versioni di questo metodo - uno con un ciclo e l'altro utilizzando guava:

public int[] loop() { 
    int[] a = new int[100]; 
    for (int i = 0; i < 100; ++i) { 
     a[i] = i; 
    } 
    return a; 
} 

public int[] guava() { 
    Set<Integer> set = ContiguousSet.create(Range.closed(0, 99), DiscreteDomains.integers()); 
    int[] a = Ints.toArray(set); 
    return a; 
} 

Ecco i risultati:

Benchmark  Mean  Mean error   Var Units 
guava  814.753   46.359  2034.726 nsec/op 
loop  79.913   5.671  30.447 nsec/op 

Quindi il primo metodo viene eseguito in 814 ns +/- 46 ns contro 80 ns +/- 5 ns per il secondo. Quindi il ciclo è circa 10 volte più veloce. Se chiami quel metodo un paio di volte, gli 800 nanosecondi non contano, se lo chiami molto spesso, scrivere il ciclo è probabilmente meglio.

0

a seconda delle dimensioni si dovrà loop, se uno piccolo è possibile effettuare le seguenti ...

int[] intArray = new int[] {4,5,6,7,8}; 

im indovinare per il vostro formato non volete dover digitare tutto fuori quindi ha senso per creare un ciclo e impostare in questo modo

0

È necessario utilizzare il ciclo per inizializzare un array così lungo. Non esiste un metodo di scelta rapida in Java come previsto.

-1

È possibile utilizzare libreria di Guava, per qualcosa di simile:

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

}

Aggiornato: completo esempio prendere da questo post Fill arrays with ranges of numbers

+0

il metodo 'range' non fa parte di guava e ha stato scritto usando un loop in quella risposta. Non aiuta qui. – assylias

+0

Probabilmente hai ragione, mi ricordo che era qualcosa del genere, ma ho preso esempio dal post collegato come è – evgenyl

0

Penso che il codice è il più breve e il modo più semplice . Potrebbe non essere necessario caricare librerie aggiuntive per ottenere più linee di codice "compatte". I loop per sono molto semplici (veramente O (n)) e leggibili, vivono e li amo.

13

Java 8 permette di farlo in una linea con IntStream oggetto e lambda espressione:

int n = 10; 
int[] values = new int[n]; 
IntStream.range(1,n+1).forEach(val -> values[val-1] = val); 
+0

Arrays.setAll() è un modo molto migliore – Arkadiy

40

Da Java 8 questo è possibile:

int[] a = IntStream.range(1, 100).toArray(); 

(E più corta dell'altra java 8 risposta).

+3

Per essere chiari, questo crea una matrice di 99 elementi. – shmosel

+0

Arrays.setAll() è un modo molto migliore. – Arkadiy

6

Un'altra alternativa, se si utilizza Java 8:

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

L'espressione lambda accetta l'indice della cella, e restituisce un valore da mettere in quella cella. In questo caso, alle celle da 0 a 99 vengono assegnati i valori 1-100.

+0

Qual è la performance di questo rispetto alla risposta accettata? – Fabian

Problemi correlati