通过索引从java.util.Collection
获取价值的最佳方法是什么?
答案 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有一个很好的例程,可以通过索引获取值,如果你真的需要:
答案 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());