我想存储数字列表 1,2,3,4 - (让我们从 List<Integer>
开始)
我希望确保数字是唯一的(好的,使用 Set<Integer>
)
我希望保证顺序(好的...使用 LinkedHashSet<Integer>
)
我希望能够获取列表中的最后一个元素...
请问,获取插入到 LinkedHashSet<Integer>
中的最后一个数字的最简单方法是什么?
我想存储数字列表 1,2,3,4 - (让我们从 List<Integer>
开始)
我希望确保数字是唯一的(好的,使用 Set<Integer>
)
我希望保证顺序(好的...使用 LinkedHashSet<Integer>
)
我希望能够获取列表中的最后一个元素...
请问,获取插入到 LinkedHashSet<Integer>
中的最后一个数字的最简单方法是什么?
针对此问题,没有预制选项。有两个临时解决方案,但都不好:
Order n 方法:
public <E> E getLast(Collection<E> c) {
E last = null;
for(E e : c) last = e;
return last;
}
呸!但也有一种Order 1的方法:
class CachedLinkedHashSet<E> extends LinkedHashSet<E> {
private E last = null;
@Override
public boolean add(E e) {
last = e;
return super.add(e);
}
public E getLast() {
return last;
}
}
这是即兴发挥的,所以可能存在细微的错误,并且肯定不是线程安全的。您的需求可能因此而有所不同,并采取一种方法而不是另一种。
getLast
方法只是告诉您最后一个添加的元素。它不能保证该元素仍在列表中。 - corsiKa<E>
中扩展extends LinkedHashSet
- 就像我说的那样,可能有一个微妙的错误 - 我只是凭记忆写下来的...显然是在圣诞前夕哈哈...这就解释了为什么我没有编译它! :) - corsiKaStream
,其中包含LinkedHashSet
,跳过前n-1个元素并获取最后一个。Integer lastInteger = set.stream().skip(s.size()-1).findFirst().get();
首先,我同意corsiKa的解决方案,该方案建议扩展LinkedHashSet
类,包含指向最后一个元素的指针。但是,您也可以使用传统方法通过使用一些数组空间来解决:
set.toArray()[ set.size()-1 ] // returns the last element.
AbstractCollection.toArray()
方法,因为只是为了获取最后一个元素而进行整个集合的硬复制。非常低效。 - Vojtěch自Java 21以来,LinkedHashSet
已经具有getLast()方法:
jshell> var set = new LinkedHashSet<>(List.of(1,2,3,4,5));
set ==> [1, 2, 3, 4, 5]
jshell> set.getLast();
$2 ==> 5
享受...
java.util.LinkedHashMap
的私有成员,这可能会导致安全异常。 - corsiKa集合与顺序无关。我们不能通过索引访问元素。如果您需要最后一个元素,
1)创建新的ArrayList(Set)
可以轻松访问ArrayList的最后一个元素。