如何获取 List 或 Set 的第一个元素? [复制]

Posted

技术标签:

【中文标题】如何获取 List 或 Set 的第一个元素? [复制]【英文标题】:How to get the first element of the List or Set? [duplicate] 【发布时间】:2012-02-11 12:41:52 【问题描述】:

我想知道是否可以获取列表或集合的第一个元素。使用哪种方法?

【问题讨论】:

Set 没有第一个元素。对于列表:list.get(0); 你有哪些,列表还是一组?集合不一定是任何特定的顺序... 有些套装是订购的,比如TreeSet 另外,恰好一个元素的集合有一个“第一个”元素。 试试 apache commons 库中的CollectionUtils.get(Object,index)。参考here 【参考方案1】:

假设你有一个List<String> strings,你想要第一个项目。

有几种方法可以做到这一点:

Java(8 之前):

String firstElement = null;
if (!strings.isEmpty() && strings.size() > 0) 
    firstElement = strings.get(0);

Java 8:

Optional<String> firstElement = strings.stream().findFirst();

番石榴

String firstElement = Iterables.getFirst(strings, null);

Apache commons (4+)

String firstElement = (String) IteratorUtils.get(strings, 0);

Apache commons(4 之前)

String firstElement = (String) CollectionUtils.get(strings, 0);

随后或封装在适当的检查或 try-catch 块中。

科特林:

在 Kotlin 中,Arrays 和大多数 Collections(例如:List)都有一个 first 方法调用。 所以你的代码看起来像这样

对于列表:

val stringsList: List<String?> = listOf("a", "b", null)
val first: String? = stringsList.first()

对于数组:

val stringArray: Array<String?> = arrayOf("a", "b", null)
val first: String? = stringArray.first()

随后或封装在适当的检查或 try-catch 块中。

Kotlin 还包括对 kotlin.collections 执行此操作的更安全的方法,例如 firstOrNull 或 getOrElse,或使用 JRE8 时的 getOrDefault

【讨论】:

【参考方案2】:

java8 及其他

Set<String> set = new TreeSet<>();
    set.add("2");
    set.add("1");
    set.add("3");
    String first = set.stream().findFirst().get();

这将帮助您检索列表或集合的第一个元素。 鉴于集合或列表不为空(get() on empty optional 将抛出 java.util.NoSuchElementException

orElse() 可以用作:(这只是一种解决方法 - 不推荐)

String first = set.stream().findFirst().orElse("");
set.removeIf(String::isEmpty);

以下是适当的方法:

Optional<String> firstString = set.stream().findFirst();
if(firstString.isPresent())
    String first = firstString.get();

同样可以检索列表的第一个元素。

希望这会有所帮助。

【讨论】:

"如果流没有遇到顺序,则可以返回任意元素"(docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html)【参考方案3】:

这不是这个问题的准确答案,但如果对象应该被排序,SortedSet 有一个 first() 方法:

SortedSet<String> sortedSet = new TreeSet<String>();
sortedSet.add("2");
sortedSet.add("1");
sortedSet.add("3");
String first = sortedSet.first(); //first="1"

排序后的对象必须实现 Comparable 接口(就像 String 一样)

【讨论】:

很高兴能够访问first 方法,但这里的问题涉及列表/设置,无论顺序如何。 我知道,当我发布这个问题时,这个问题已经得到了回答,它只是作为相关信息。我的想法是,在某些情况下寻找答案的人很可能想要使用已排序的对象。我编辑了我的答案。【参考方案4】:

我很惊讶还没有人建议番石榴解决方案:

com.google.common.collect.Iterables.get(collection, 0)
// or
com.google.common.collect.Iterables.get(collection, 0, defaultValue)
// or
com.google.common.collect.Iterables.getFirst(collection, defaultValue)

或者如果您期望单个元素:

com.google.common.collect.Iterables.getOnlyElement(collection, defaultValue)
// or
com.google.common.collect.Iterables.getOnlyElement(collection)

【讨论】:

【参考方案5】:

在 Java >=8 中,您还可以使用 Streaming API:

Optional<String> first = set.stream().findFirst();

(如果 Set/List 可能为空,则很有用。)

【讨论】:

这看起来不错,但没有 get() 我无法调用结果元素特定的方法。set.stream().findFirst().get() 将允许您调用结果对象上的任何方法。例如:set.stream().findFirst().get().getMessage() @Diablo 不过要小心,因为如果可选为空,get() 会抛出异常。 Optional 上还有很多其他方法可能更合适。 如果你想让它返回null,只需执行String first = set.stream().findFirst().orElse(null); @troosan 这仍然不是 null 安全的,因为集合的第一个元素可以是 null,在这种情况下 findFirst() 将抛出 NPE。零安全的方法是使用类似:set.stream().map(Optional::ofNullable).findFirst().orElseGet(Optional::empty).orElse(null)。首先,我们将流的第一个元素包装到 Optional 中,然后,在 findFirst()(将我们的 Optional 包装到另一个 Optional 中)之后,我们将其解包回来,如果 Set 为空,则返回 Optional.empty()。然后,最后,我们返回 Set 的第一个元素或 null。 @djxak 确实你是对的,如果你不确定集合包含什么(以及使用集合的实现),你的建议当然更安全【参考方案6】:

设置

set.toArray()[0];

列表

list.get(0);

【讨论】:

set.toArray()[0] 将必须通过整个集合内容来创建一个数组以仅获取第一个元素,这不是很有效。 这会导致性能非常低 对于一个集合,这个方法返回一个Object而不是Set中的元素类型。【参考方案7】:

查看 javadoc

List

list.get(0);

或Set

set.iterator().next();

并在使用上述方法之前通过调用isEmpty()检查大小

!list_or_set.isEmpty()

【讨论】:

使用isEmpty() 而不是size()&gt;0。它可以更好地显示您的意图并且可能更有效(例如,LinkList size() is O(n))。 @SteveKuo LinkedList 有一个大小变量,因此 size() 为 O(1)。此外,isEmpty() 实现为 size() == 0。 始终使用List.iterator().next()Set.iterator().next() 来避免链接数据结构的O(N),您永远不知道您将收到什么实现,当然可以使用Set.isEmpty() 或@987654332 进行验证@ 出于同样的原因,如果再次像 LinkedListLinkedHashSet 一样传递链接数据结构的实现,这两种情况都将始终是 O(1) 而不是潜在的 O(N) 这应该是公认的答案,虽然不是太冗长,但给出了最准确的答案并且完美运行!【参考方案8】:

您可以使用 get(index) 方法来访问 List 中的元素。

根据定义,集合只是包含元素并且没有特定的顺序。因此,您无法获得“第一个”元素,但可以使用迭代器(使用 for each 循环)对其进行迭代,或者使用 toArray() 方法将其转换为数组。

【讨论】:

【参考方案9】:
Collection c;

Iterator iter = c.iterator();

Object first = iter.next();

(这是您最接近拥有Set 的“第一个”元素。您应该意识到它对于Set 的大多数实现绝对没有意义。这可能对 LinkedHashSet 和 TreeSet 有意义,但不适用于 HashSet。)

【讨论】:

如果您只想尽快从集合中获得任何东西,这很有用 如果你的集合只有一个元素就足够了。 集合 c; c.iterator().next();

以上是关于如何获取 List 或 Set 的第一个元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

随机获取一个集合(List, Set)中的元素,随机获取一个Map中的key或value

如何获取jQuery集合的某一项

用el标签如何获取列表中的第一个元素?

list怎么获取元素里面的一个值

c# 如何获取列表中某个属性最大或最小的元素?

python中的list元组如何按照第二维元素排序