通过索引获取集合的最佳方式
什么是通过索引从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) }