Qual è il modo migliore per ottenere valore da java.util.Collection per indice?Il modo migliore per ottenere valore dalla collezione per indice
risposta
Converti raccolta in una matrice utilizzando la funzione Object [] toArray (Object [] a)
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.
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?
È 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".
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.
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
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
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());
}
Sono d'accordo che questo è generalmente una cattiva idea . Tuttavia, Commons Collections aveva una bella routine per ottenere il valore di indice, se si ha realmente bisogno di:
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.
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)
}
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
@jobbert Si può assolutamente iterare su di esso. In questo caso si ottiene un 'Set' perché questo è il contratto dell'interfaccia di' Mappa'. – butterchicken