我有一个集合,我想获得该集合的最后一个元素。这样做最直接,最快速的方法是什么?
一种解决方案是首先使用toArray(),然后返回数组的最后一个元素。还有其他更好的吗?
答案 0 :(得分:53)
Collection
不一定是有序的元素集,因此可能没有“last”元素的概念。如果您想要订购的商品,可以使用SortedSet
方法last()
。或者您可以使用List
并致电mylist.get(mylist.size()-1);
如果确实需要最后一个元素,则应使用List
或SortedSet
。但是,如果你拥有的只是一个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;
}
答案 1 :(得分:44)
Iterables.getLast
。
它也对List
和SortedSet
进行了一些优化。
答案 2 :(得分:9)
一个解决方案可能是:
list.get(list.size()-1)
编辑:您必须将集合转换为列表之前可能是这样的:new ArrayList(coll)
答案 3 :(得分:6)
这不是一个非常有效的解决方案,但是工作一个:
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;
}
答案 4 :(得分:3)
如果您对底层Collection一无所知,那么合理的解决方案是使用迭代器,但确实知道有一个“last”元素。情况并非总是如此,并非所有集合都是订购的。
Object lastElement = null;
for (Iterator collectionItr = c.iterator(); collectionItr.hasNext(); ) {
lastElement = collectionItr.next();
}
答案 5 :(得分:2)
Collection接口中没有last()
或first()
方法。要获取最后一个方法,您可以在列表上执行get(size() - 1)
或反转列表并执行get(0)
。除非您正在处理last()
或Stacks
Queues
方法
答案 6 :(得分:0)
或者你可以使用for-each循环:
Collection<X> items = ...;
X last = null;
for (X x : items) last = x;
答案 7 :(得分:0)
为避免上面提到的一些问题(对于null等而言不健壮),为了获取列表中的第一个和最后一个元素,可以采用一种方法
import java.util.List;
public static final <A> A getLastElement(List<A> list) {
return list != null ? getElement(list, list.size() - 1) : null;
}
public static final <A> A getFirstElement(List<A> list) {
return list != null ? getElement(list, 0) : null;
}
private static final <A> A getElement(List<A> list, int pointer) {
A res = null;
if (list.size() > 0) {
res = list.get(pointer);
}
return res;
}
采用的惯例是,空列表的第一个/最后一个元素为null ...
答案 8 :(得分:0)
这应该可以正常工作,而无需转换为列表/数组:
collectionName.stream().reduce((prev, next) -> next).orElse(null)
答案 9 :(得分:0)
如果您有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);