如何获取 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()>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 进行验证@ 出于同样的原因,如果再次像 LinkedList
或 LinkedHashSet
一样传递链接数据结构的实现,这两种情况都将始终是 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 的第一个元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章