Каков наилучший способ получить значение из 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]);
Если вы знаете, какие дженерики я могу предоставить образцы для этого тоже.
Изменить: Еще один вопрос, что такое намерение и семантика исходной коллекции.
Ответ 4
Я согласен, что это вообще плохая идея. Тем не менее, Commons Collections была хорошая процедура для получения значения по индексу, если вам действительно нужно:
Ответ 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());