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

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

【问题讨论】:

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

标签: java list collections set


【解决方案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 执行此操作的更安全的方法,例如 firstOrNullgetOrElse,或使用 JRE8 时的 getOrDefault

【讨论】:

    【解决方案2】:

    及其他

    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();
    }
    

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

    希望这会有所帮助。

    【讨论】:

    【解决方案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();
        猜你喜欢
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 2015-12-08
        • 2013-10-20
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 2018-09-28
        相关资源
        最近更新 更多