2009-06-26 1 views

risposta

2

Converti raccolta in una matrice utilizzando la funzione Object [] toArray (Object [] a)

17

In generale, non v'è alcun modo buono, come Collection s non sono garantiti per avere indici fissi. Sì, è possibile scorrere attraverso di essi, che è il modo in cui toArray (e altre funzioni) funzionano. Ma l'ordine di iterazione non è necessariamente fisso, e se stai cercando di indicizzare in una raccolta generale, probabilmente stai facendo qualcosa di sbagliato. Avrebbe più significato indicizzare in un List.

46

Non si dovrebbe. a Collection evita di parlare di indici in particolare perché potrebbe non avere senso per la raccolta specifica. Ad esempio, un List implica qualche forma di ordinamento, ma un Set no.

Collection<String> myCollection = new HashSet<String>(); 
    myCollection.add("Hello"); 
    myCollection.add("World"); 

    for (String elem : myCollection) { 
     System.out.println("elem = " + elem); 
    } 

    System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]); 

mi dà:

elem = World 
    elem = Hello 
    myCollection.toArray()[0] = World 

Mentre:

myCollection = new ArrayList<String>(); 
    myCollection.add("Hello"); 
    myCollection.add("World"); 

    for (String elem : myCollection) { 
     System.out.println("elem = " + elem); 
    } 

    System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]); 

mi da:

elem = Hello 
    elem = World 
    myCollection.toArray()[0] = Hello 

Perché vuoi fare questo? Non potresti semplicemente scorrere la collezione?

+0

Ciao @butterchicken, il mio caso è che io uso un LinkedHashMap in cui ottengo il mazzo di chiavi (che è un insieme ). Ho trovato questo post: http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keys-and-values-from-a-linkedhashmap-o that the order within questo Set è garantito. Non dovrei ancora accedervi? – jobbert

+1

@jobbert Si può assolutamente iterare su di esso. In questo caso si ottiene un 'Set' perché questo è il contratto dell'interfaccia di' Mappa'. – butterchicken

4

È necessario avvolgere la raccolta in un elenco (new ArrayList(c)) o utilizzare c.toArray() poiché le raccolte non hanno la nozione di "indice" o "ordine".

14

Sono d'accordo con la risposta Matthew Flaschen s' e solo voluto mostrare esempi delle opzioni per il caso non è possibile passare alla lista (perché una biblioteca restituisce una Collection):

List list = new ArrayList(theCollection); 
list.get(5); 

O

Object[] list2 = theCollection.toArray(); 
doSomethingWith(list[2]); 

Se sai cosa sono i generici, posso fornire anche dei campioni.

Modifica: È un'altra domanda quale sia l'intento e la semantica della raccolta originale.

+1

Se la funzione di libreria restituisce una raccolta, quindi non penso che tu abbia alcuna garanzia circa l'ordine degli elementi all'interno di quella raccolta. Presumibilmente la chiamata alla biblioteca restituisce una collezione proprio perché non vuole che tu faccia questo tipo di ipotesi? – butterchicken

+0

Buon punto. L'OP non ha condiviso abbastanza informazioni sul tipo di libreria che sta utilizzando. Alcune librerie restituiscono la raccolta solo perché lo sviluppatore ha letto su una best practice per restituire alcune super interfacce invece dell'implementazione concreta. La libreria potrebbe restituire Iterable solo se non è mai stato previsto di consentire nient'altro che il looping del risultato (come in AXIOM). – akarnokd

1

si definitivamente desidera un List:

L'interfaccia List fornisce quattro metodi per posizionale (indicizzato) l'accesso a elencare gli elementi. Gli elenchi (come gli array Java) sono basati su zero.

anche

noti che tali operazioni possono eseguire in tempo proporzionale al valore di indice per alcune implementazioni (classe LinkedList, per esempio). Pertanto, l'iterazione degli elementi in un elenco> è in genere preferibile per indicizzare attraverso di esso se il chiamante non conosce l'implementazione .

Se è necessario l'indice al fine di modificare la vostra collezione si dovrebbe notare che List fornisce uno speciale ListIterator che consentono di ottenere l'indice:

List<String> names = Arrays.asList("Davide", "Francesco", "Angelocola"); 
    ListIterator<String> i = names.listIterator(); 

    while (i.hasNext()) { 
     System.out.format("[%d] %s\n", i.nextIndex(), i.next()); 
    } 
1

Sarebbe altrettanto opportuno semplicemente convertire la vostra collezione in un elenco ogni volta che si aggiorna. Ma se stai inizializzando, questo è sufficiente:

 for(String i : collectionlist){ 
     arraylist.add(i); 
     whateverIntID = arraylist.indexOf(i); 
    } 

Essere di mentalità aperta.

0

uso per ogni loop ...

ArrayList<Character> al=new ArrayList<>(); 

String input="hello"; 

for(int i=0;i<input.length();i++){ 
      al.add(input.charAt(i)); 
     } 

     for (Character ch : al) { 

      System.Out.println(ch) 

}