2009-06-26 21 views

Odpowiedz

2

Konwersja gromadzenia w tablicy przy użyciu funkcji Zadanie [] toArray (Object [] a)

17

Generalnie, nie ma dobrego sposobu, jak Collection nie jest gwarantowany ustalili indeksów. Tak, możesz je iterować, tak jak działa funkcja Array (i inne funkcje). Ale kolejność iteracji niekoniecznie jest naprawiona, a jeśli próbujesz utworzyć indeks do ogólnej kolekcji, prawdopodobnie robisz coś źle. Bardziej sensownym byłoby indeksowanie do List.

46

Nie powinieneś. a Collection unika omawiania indeksów, ponieważ może nie mieć sensu dla określonego zbioru. Na przykład: List sugeruje jakąś formę zamawiania, ale Set nie.

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

daje mi:

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

Podczas:

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

daje mi:

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

Dlaczego chcesz to zrobić? Czy możesz nie tylko przejrzeć kolekcję?

+0

Hi @butterchicken, moja sprawa jest taka, że ​​używam LinkedHashMap gdzie mogę dostać zestaw kluczy (który to zestaw ). Znalazłem ten post: http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-return--keys-and-values-od--linkedhashmap-o, że porządek wewnątrz ten zestaw jest gwarantowany. Czy nadal nie powinienem się nad tym zastanawiać? – jobbert

+1

@jobbert Możesz absolutnie iterować nad nim. W tym przypadku dostajesz 'Set', ponieważ jest to umowa interfejsu' Map'. – butterchicken

4

Musisz zawinąć swoją kolekcję na liście (new ArrayList(c)) lub użyć c.toArray(), ponieważ Kolekcje nie mają pojęcia "indeks" lub "zamówienie".

14

zgadzam się z odpowiedzią Matthew Flaschen „s i po prostu chciał pokazać przykłady wariantów przypadku nie można przełączyć się do listy (bo zwrotów bibliotekę zbiór):

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

Albo

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

Jeśli wiesz, co to jest generics, mogę dostarczyć próbki również.

Edytuj: To kolejne pytanie, co jest intencją i semantyką oryginalnej kolekcji.

+1

Jeśli funkcja biblioteczna zwraca kolekcję, to nie sądzę, że masz jakiekolwiek gwarancje co do kolejności elementów wewnątrz tej kolekcji. Przypuszczalnie wywołanie biblioteki zwraca kolekcję właśnie dlatego, że nie chce, abyś dokonywał tego rodzaju założeń? – butterchicken

+0

Dobra uwaga. PO nie podzielił się wystarczającą ilością informacji na temat rodzaju biblioteki, z której korzysta. Niektóre biblioteki zwracają kolekcję tylko dlatego, że programista przeczytał o najlepszej praktyce, aby zwrócić jakiś super interfejs zamiast konkretnej implementacji. Biblioteka mogłaby po prostu zwrócić Iterable, jeśli nigdy nie zamierzano pozwolić na nic innego poza zapętleniem wyniku (jak w AXIOM). – akarnokd

1

ty ostatecznie chcą List:

Interfejs Lista zawiera cztery metody pozycjonowania (indeksowane) dostęp do elementów listy. Listy (takie jak tablice Java) mają wartość zero.

także

Zauważ, że te operacje można wykonać w czasie proporcjonalnym do wartości indeksu dla niektórych wdrożeń (klasy LinkedList, na przykład). Tak więc, iteracja nad elementami na liście> jest zazwyczaj lepsza niż indeksowanie przez nią, jeśli osoba dzwoniąca nie zna implementacji .

Jeśli potrzebujesz indeksu w celu zmiany swojej kolekcji należy pamiętać, że lista zawiera specjalną ListIterator które pozwalają uzyskać indeks:

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

Byłoby tak wygodne, aby po prostu przekonwertować swoją kolekcję na listę ilekroć aktualizacji. Ale jeśli inicjujesz, wystarczy:

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

Bądź otwarty.

0

zastosowanie dla każdej pętli ...

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) 

} 
Powiązane problemy