通过索引从Collection获取价值的最佳方式

时间:2009-06-26 08:23:07

标签: java collections

通过索引从java.util.Collection获取价值的最佳方法是什么?

10 个答案:

答案 0 :(得分:49)

你不应该。 a 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

你为什么要这样做?你可以不只是迭代收集?

答案 1 :(得分:18)

一般来说,没有好方法,因为Collection不能保证有固定的索引。是的,您可以遍历它们,这是如何(和其他功能)工作的。但迭代顺序不一定是固定的,如果你试图索引到一般的集合,你可能做错了。索引List会更有意义。

答案 2 :(得分:17)

我同意 Matthew Flaschen 的回答,只想展示无法切换到List的案例的选项示例(因为库会返回一个集合):

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

或者

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

如果您知道什么是仿制药,我也可以为此提供样品。

编辑:这是另一个问题,原始集合的意图和语义是什么。

答案 3 :(得分:10)

我同意这通常是一个坏主意。但是,Commons Collections有一个很好的例程,可以通过索引获取值,如果你真的需要:

CollectionUtils.get(collection, index)

答案 4 :(得分:5)

您必须将您的收藏包装在一个列表(new ArrayList(c))或使用c.toArray(),因为收藏集没有“索引”或“订单”的概念。

答案 5 :(得分:2)

使用函数

将集合转换为数组
Object[] toArray(Object[] a) 

答案 6 :(得分:1)

你肯定想要一个List

  

List接口提供了四种对列表元素进行位置(索引)访问的方法。   列表(如Java数组)基于零。

另外

  

请注意,这些操作可能会在某些时间内与索引值成比例地执行   实现(例如LinkedList类)。因此,迭代&gt;中的元素。如果调用者不知道,则list通常最好通过它进行索引   实施

如果您需要索引以修改您的收藏,您应该注意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());
}

答案 7 :(得分:1)

只要更新,只需将集合转换为列表就可以了。但是如果你正在初始化,这就足够了:

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

心胸开阔。

答案 8 :(得分:0)

用于每个循环...

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

答案 9 :(得分:0)

您可以使用for-each循环或迭代器接口从集合中获取值。对于集合c for (<ElementType> elem: c) System.out.println(elem); 或使用迭代器接口

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