Лучший способ получить значение из коллекции по индексу - PullRequest
41 голосов
/ 26 июня 2009

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

Ответы [ 9 ]

50 голосов
/ 26 июня 2009

Ты не должен. 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

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

18 голосов
/ 26 июня 2009

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

17 голосов
/ 26 июня 2009

Я согласен с ответом Мэтью Флэшена и просто хотел показать примеры вариантов для случая, когда вы не можете переключиться на Список (поскольку библиотека возвращает вам Коллекцию):

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

Или

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

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

Редактировать: Другой вопрос, какова цель и семантика исходной коллекции.

10 голосов
/ 26 июня 2009

Я согласен, что это вообще плохая идея. Тем не менее, Commons Collections имеет хорошую процедуру получения значения по индексу, если вам действительно нужно:

CollectionUtils.get (коллекция, индекс)

5 голосов
/ 26 июня 2009

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

2 голосов
/ 26 июня 2009

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

Object[] toArray(Object[] a) 
1 голос
/ 07 ноября 2013

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

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

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

1 голос
/ 26 июня 2009

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

Интерфейс 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());
}
0 голосов
/ 13 сентября 2014

использовать для каждой петли ...

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);             
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...