我有一个集合,想获取集合中最后一个元素。最简单且快速的方法是什么?
一种解决方法是先使用toArray()方法,然后返回数组的最后一个元素。还有其他更好的方式吗?
我有一个集合,想获取集合中最后一个元素。最简单且快速的方法是什么?
一种解决方法是先使用toArray()方法,然后返回数组的最后一个元素。还有其他更好的方式吗?
Collection
不一定是元素有序的集合,因此可能不存在“last”元素的概念。如果您需要一个有序的集合,可以使用SortedSet
/NavigableSet
,它具有 last()
方法。或者您可以使用List
并调用mylist.get(mylist.size()-1)
来获取最后一个元素。List
或SortedSet
/NavigableSet
。但是,如果您只有一个Collection
并且确实非常需要最后一个元素,您可以使用toArray()
或使用迭代器Iterator
并迭代到列表末尾。public Object getLastElement(final Collection c) {
final Iterator itr = c.iterator();
Object lastElement = itr.next();
while(itr.hasNext()) {
lastElement = itr.next();
}
return lastElement;
}
Iterables.getLast
可以获取一个可迭代对象的最后一个元素,对于List
和SortedSet
也进行了一些优化。
这应该可以在不转换为列表/数组的情况下工作:
collectionName.stream().reduce((prev, next) -> next).orElse(null)
这不是一个非常高效的解决方案,但它是有效的:
public static <T> T getFirstElement(final Iterable<T> elements) {
return elements.iterator().next();
}
public static <T> T getLastElement(final Iterable<T> elements) {
T lastElement = null;
for (T element : elements) {
lastElement = element;
}
return lastElement;
}
List
除外)。 - Dmitry Ginzburg那么一个解决方案可能是:
list.get(list.size()-1)
编辑:在进行下一步操作之前,您需要将集合转换为列表,可以像这样:new ArrayList(coll)
如果您不知道底层集合的情况,但是确定存在“last”元素,一个合理的解决方案是使用迭代器。但并非所有集合都是有序的。
Object lastElement = null;
for (Iterator collectionItr = c.iterator(); collectionItr.hasNext(); ) {
lastElement = collectionItr.next();
}
在集合接口中没有last()
或first()
方法。要获取最后一个方法,您可以在列表上执行get(size() - 1)
,或者反转列表并执行get(0)
。我认为除非您正在处理Stacks
或Queues
,否则不需要在任何集合API中使用last()
方法。
或者你可以使用 for-each 循环:
Collection<X> items = ...;
X last = null;
for (X x : items) last = x;
如果您有Iterable,请将其转换为流并查找最后一个元素
Iterator<String> sourceIterator = Arrays.asList("one", "two", "three").iterator();
Iterable<String> iterable = () -> sourceIterator;
String last = StreamSupport.stream(iterable.spliterator(), false).reduce((first, second) -> second).orElse(null);
Object lastElement = null;
来返回空集合的情况下的null值。 - Markus PscheidtlastElement
变量,但它能正常工作。 - Alex Vergara