Modo migliore per ottenere il valore da Collezione da indice

Qual è il modo migliore per ottenere il valore da java.util.Collection dall’indice?

InformationsquelleAutor keo | 2009-06-26

 

9 Replies
  1. 51

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

    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 dà:

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

    Perché vuoi fare questo? Non basta iterare la collezione?

    • Ciao @butterchicken, il mio caso è che io uso un linkedhashmap dove ho la keyset (che è un Insieme<String>). Ho trovato questo post: stackoverflow.com/questions/2923856/… che l’ordine all’interno di questo Insieme è garantita. Devo ancora itarate su di esso?
    • Si può assolutamente scorrere su di esso. Si ottiene un Set indietro, in questo caso, perché è il contratto di interfaccia di Map.
  2. 18

    In generale, non c’è buon modo, come Collections non è garantito fisso indici. Sì, si può scorrere attraverso di loro, che è come toArray (e altre funzioni) di lavoro. Ma l’iterazione ordine non è necessariamente fisso, e se si sta cercando di un indice in una Raccolta generale, probabilmente stai facendo qualcosa di sbagliato. Avrebbe più senso per indice in un Elenco.

  3. 17

    Sono d’accordo con Matteo Flaschen‘s risposta e solo voluto mostrare esempi di opzioni per il caso non è possibile passare alla Lista (perché una biblioteca restituisce una Collezione):

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

    O

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

    Se si sa cosa generics è che posso fornire i campioni per questo.

    Edit: È un’altra questione che l’intento e la semantica dell’originale collezione.

    • Se la funzione di libreria restituisce una Collezione, quindi non credo che hai tutte le garanzie circa l’ordine degli elementi all’interno di tale insieme. Presumibilmente la libreria chiamata restituisce una Collezione che, proprio perché non vuole fare questo tipo di ipotesi?
    • Un buon punto. L’OP non condividere informazioni sufficienti sul tipo di libreria che sta utilizzando. Alcune librerie di ritorno Raccolta solo perché lo sviluppatore leggere una best practice per tornare un po ‘ di super interfaccia, invece di attuazione concreta. La libreria può solo tornare Iterable se non c’è mai stata un’intenzione di permettere a niente altro, ma looping il risultato (come ASSIOMA).
  4. 5

    È necessario avvolgere la vostra collezione in un elenco (new ArrayList(c)) o utilizzare c.toArray() poiché Collezioni hanno nessuna nozione di “indice” o “ordine”.

  5. 1

    Sarebbe altrettanto semplicemente conveniente convertire la vostra collezione in un elenco ogni volta che si aggiorna. Ma se l’inizializzazione, questo sarà sufficiente:

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

    Essere di mentalità aperta.

  6. 1

    definitivamente desidera un Elenco:

    Elenco interfaccia offre quattro metodi per posizionali (indicizzata) l’accesso all’elenco di elementi.
    Elenchi (come Java gli array) sono a base zero.

    Anche

    Nota che queste operazioni possono essere eseguite in un tempo proporzionale al valore dell’indice per alcuni
    implementazioni (la classe LinkedList, per esempio). Così, scorrendo gli elementi in a > elenco è in genere preferibile indicizzazione, attraverso di esso, se il chiamante non sa il
    implementazione.

    Se avete bisogno di indice per modificare la tua collezione si dovrebbe notare che l’Elenco fornisce una 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());
    }
  7. 0

    utilizzare per ogni ciclo…

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

Lascia un commento