从集合中获取第一个(也是唯一的值)[重复]
Posted
技术标签:
【中文标题】从集合中获取第一个(也是唯一的值)[重复]【英文标题】:Getting the first (and only value) from a collection [duplicate] 【发布时间】:2012-12-30 14:37:08 【问题描述】:可能重复:Java: Get first item from a collection
在 Java 中,我经常遇到一个包含一个元素的集合,我需要检索它。因为集合不保证顺序一致,所以没有first()
或者get(int index)
方法,所以我需要使用比较丑的东西,比如:
public Integer sillyExample(Collection<Integer> collection)
if(collection.size()==1)
return collection.iterator().next();
return someCodeToDecideBetweenElements(collection);
那么,你如何取出唯一的元素呢?我不敢相信没有更好的方法...
请注意,我知道没有“第一个”的概念,我只是想避免构建迭代器,因为我知道其中只有一个元素。
编辑:Peter Wooster 发现了一个非常相似的问题here。我将其保持打开状态是因为我不是试图获取“第一个”元素,这意味着一致的顺序,而是在检查它确实是唯一元素之后的“唯一”元素。
【问题讨论】:
完全像这样,除非我不敢打电话给size()
。 Iterator<Integer> it = collection.iterator(); return it.hasNext()? it.next() : null;
,现在您可以转到更通用的Iterable
。
Collection
不提供first()
或get(int)
其实是件好事,因为集合通常是无序的,并且没有“第一”元素
这是一篇关于这个主题的旧帖子:***.com/questions/1671378/…
我会像上面 Marko Topolnic 的评论那样做,只需要一个通用的方法签名。
还要考虑到“构建迭代器”并不是一个真正好的范例:迭代器是一个非常轻量级的对象,旨在随意创建,对性能的影响可以忽略不计。
【参考方案1】:
最简单的答案就是你做了什么!
first = collection.iterator().next();
注意 iterator() 是一个方法,是不是打错字了?
【讨论】:
谢谢彼得!是的,我忘记了迭代器中的 () ;) 现在已修复。 为什么接受的答案不包括问题的“唯一价值”部分?【参考方案2】:您看过 Google Guava 吗?如果您知道集合只有一个元素,您可以使用Iterables.getOnlyElement(collectionWithOneElement);
,但如果您不知道但仍只想要第一个元素,您可以使用getFirst(Iterable, T default)
。如果它为空,它还将返回您定义的默认值。
【讨论】:
谢谢!我不知道这个方法,但我只是检查了一下,它在内部做return iterators.getOnlyElement(iterable.iterator());
所以它仍然在内部构建一个迭代器
...它对迭代器的作用也是完全可以预测的,就像我在问题下的评论中一样。这可能会让您确信这种方法是最好的。【参考方案3】:
就这么简单,
Iterator<Integer> itr = collection.iterator();
Object firstObj = itr.hasNext()? itr.next() : null;
【讨论】:
以上是关于从集合中获取第一个(也是唯一的值)[重复]的主要内容,如果未能解决你的问题,请参考以下文章