按索引从 Collection 中获取价值的最佳方式
Posted
技术标签:
【中文标题】按索引从 Collection 中获取价值的最佳方式【英文标题】:Best way to get value from Collection by index 【发布时间】:2010-11-06 02:03:09 【问题描述】:按索引从java.util.Collection
获取价值的最佳方式是什么?
【问题讨论】:
【参考方案1】:你不应该。 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
为什么要这样做?你不能只遍历集合吗?
【讨论】:
嗨@butterchicken,我的情况是我使用了一个linkedhashmap来获取键集(这是一个SetSet
,因为那是Map
的接口的契约。【参考方案2】:
我同意 Matthew Flaschen 的回答,并且只是想展示您无法切换到 List 的情况下的选项示例(因为库返回给您一个 Collection):
List list = new ArrayList(theCollection);
list.get(5);
或者
Object[] list2 = theCollection.toArray();
doSomethingWith(list[2]);
如果您知道什么是泛型,我也可以提供示例。
编辑:原始集合的意图和语义是什么是另一个问题。
【讨论】:
如果库函数返回一个集合,那么我认为您无法保证该集合中元素的顺序。大概库调用返回一个 Collection 正是因为它不希望您做出这些假设? 好点。 OP 没有分享有关他正在使用哪种库的足够信息。一些库返回 Collection 只是因为开发人员阅读了返回某些超级接口而不是具体实现的最佳实践。如果除了循环结果(如在 AXIOM 中)之外从未打算允许其他任何操作,则库可以只返回 Iterable。【参考方案3】:一般来说,没有什么好办法,因为Collection
s 不能保证有固定的索引。是的,您可以遍历它们,这就是 toArray(和其他函数)的工作方式。但是迭代顺序不一定是固定的,如果你试图索引到一个通用的集合中,你可能做错了什么。索引到List 会更有意义。
【讨论】:
【参考方案4】:我同意这通常是个坏主意。但是,Commons Collections 有一个很好的例程,可以在您确实需要时按索引获取值:
CollectionUtils.get(collection, index)
【讨论】:
【参考方案5】:您必须将您的收藏包含在一个列表中 (new ArrayList(c)
) 或使用 c.toArray()
,因为收藏没有“索引”或“顺序”的概念。
【讨论】:
【参考方案6】:使用函数将集合转换为数组
Object[] toArray(Object[] a)
【讨论】:
【参考方案7】:每当您的收藏更新时,只需将其转换为列表同样方便。但如果你正在初始化,这就足够了:
for(String i : collectionlist)
arraylist.add(i);
whateverIntID = arraylist.indexOf(i);
思想开放。
【讨论】:
【参考方案8】:你肯定想要List:
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());
【讨论】:
【参考方案9】:用于每个循环...
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);
【讨论】:
【参考方案10】:您可以使用 for-each 循环或使用迭代器接口从集合中获取值。收藏 c
for (<ElementType> elem: c)
System.out.println(elem);
或使用迭代器接口
Iterator it = c.iterator();
while (it.hasNext())
System.out.println(it.next());
【讨论】:
【参考方案11】:如果您的Collection
是List
,只需将其转换为List
并调用get(final int index)
。否则,考虑在有序集中查找第 n 个元素可能是有意义的,例如,如果它是一个尊重插入顺序的 LinkedHashSet
(请记住,可以创建不尊重插入顺序的这样一个实例),您可以使用 @ 987654326@.
【讨论】:
以上是关于按索引从 Collection 中获取价值的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章