通过索引获取集合的最佳方式

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

你不应该。 一个Collection避免了专门讨论索引,因为它可能对特定的集合没有意义。 例如,一个List意味着某种forms的sorting,但是一个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 

你为什么要这样做? 你不能只是迭代集合?

一般来说,没有好的方法,因为Collection不能保证有固定的索引。 是的,你可以迭代他们,这是如何ArrayArray(和其他function)的工作。 但是迭代顺序不一定是固定的,如果你想索引到一个普通的集合,你可能做错了什么。 索引一个列表会更有意义。

我同意Matthew Flaschen的回答,只是想展示一下你不能切换到List的例子(因为一个库会返回一个Collection):

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

要么

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

如果你知道什么是generics,我也可以提供样本。

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

我同意这通常是一个坏主意。 然而,如果您真的需要, Commons Collections有一个很好的例行程序来获取索引的价值:

CollectionUtils.get(集合,索引)

你必须把你的集合包装在一个列表中( new ArrayList(c) ),或者使用c.toArray()因为集合没有“索引”或“顺序”的概念。

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

你明确想要一个列表 :

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

请注意,这些操作的执行时间可能与某些实现(例如LinkedList类)的索引值成比例。 因此,如果调用者不知道实现,遍历> 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()); } 

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

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

思想开放。

用于每个循环…

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