从集合中获取第一个(也是唯一的值)[重复]

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&lt;Integer&gt; 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;

【讨论】:

以上是关于从集合中获取第一个(也是唯一的值)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

STL中set能不能返回指定的第几个元素的值?

STL set

获取哈希中唯一条目的值[重复]

C# 中如何从List集合中提取第一个值

如何将日期对象作为第一个也是唯一的输入参数传递给 PL-SQL

C# 中如何从List集合中提取第一个值