Лучший способ получить ценность из коллекции по индексу

Каков наилучший способ получить значение из java.util.Collection по индексу?

Ответ 1

Ты не должен. Collection избегает говорить об индексах конкретно, потому что это может не иметь смысла для конкретной коллекции. Например, List подразумевает некоторую форму упорядочения, а Set - нет.

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

дает мне:

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

в то время:

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

дает мне:

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

Почему ты хочешь это сделать? Не могли бы вы просто перебрать коллекцию?

Ответ 2

В общем, нет хорошего способа, так как Collection не имеют фиксированных индексов. Да, вы можете выполнять итерацию через них, как работает функцияArray (и другие функции). Но порядок итераций не обязательно фиксирован, и если вы пытаетесь индексировать общую коллекцию, вы, вероятно, делаете что-то неправильно. Было бы более целесообразно индексироваться в List.

Ответ 3

Я согласен с ответом Matthew Flaschen и просто хотел показать примеры вариантов для случая, когда вы не можете переключиться на List (потому что библиотека возвращает вам коллекцию):

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

или

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

Если вы знаете, какие дженерики я могу предоставить образцы для этого тоже.

Изменить: Еще один вопрос, что такое намерение и семантика исходной коллекции.

Ответ 5

Вы должны либо обернуть свою коллекцию в список (new ArrayList(c)), либо использовать c.toArray(), поскольку коллекции не имеют понятия "индекс" или "порядок".

Ответ 6

Преобразовать коллекцию в массив с помощью функции

Object[] toArray(Object[] a) 

Ответ 7

Вы определенно хотите список List:

Интерфейс List предоставляет четыре метода для позиционного (индексированного) доступа к элементам списка. Списки (например, массивы Java) начинаются с нуля.

Также

Обратите внимание, что эти операции могут выполняться во времени, пропорциональном значению индекса для некоторых реализации (класс LinkedList, например). Таким образом, перебор элементов списка> обычно предпочтительнее индексации, если вызывающий не знает осуществление.

Если вам нужен индекс для изменения вашей коллекции, вы должны заметить, что List предоставляет специальный ListIterator, который позволяет вам получить индекс:

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

Ответ 8

Было бы так же удобно просто конвертировать вашу коллекцию в список всякий раз, когда она обновляется. Но если вы инициализируете, этого будет достаточно:

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

Будьте непредубежденными.

Ответ 9

использовать для каждого цикла...

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

Ответ 10

Вы можете получить значение из коллекции, используя цикл for-each или интерфейс итератора. Для коллекции c for (<ElementType> elem: c) System.out.println(elem); или используя интерфейс итератора

 Iterator it = c.iterator(); 
        while (it.hasNext()) 
        System.out.println(it.next());