我有一个场景,我正在使用迭代器迭代一个集合。现在我想删除第一个元素,而我的迭代器在第二个元素上。我该怎么做。我知道Set是无序的,没有像第一个或第二个元素的东西,但我的问题是我想要删除Iterator.next当前没有返回的元素
我不想将此设置转换为list并使用listIterator。
我不想在其他集合中收集要删除的所有对象并调用删除所有
我无法存储它并在迭代后删除
示例代码。
Set<MyObject> mySet = new HashSet<MyObject>();
mySet.add(MyObject1);
mySet.add(MyObject2);
...
Iterator itr = mySet.iterator();
while(itr.hasNext())
{
// Now iterator is at second element and I want to remove first element
}
答案 0 :(得分:0)
HashSet是无序的,javadoc明确指出迭代器删除方法 Removes from the underlying collection the last element returned by this iterator (optional operation).
所以答案是通过迭代器没有。因为HashSet包含唯一的元素,你可以在遍历第一个元素后使用Set.remove(Object),在thios情况下你甚至不需要去第二个元素
HashSet<K> hs;// you HashSet containing unique elements
if(!hs.isEmpty())
{
hs.remove(hs.iterator().next());
}
<强> Just remember HashSet is unordered and there is no such thing as 1st or 2nd element
强>
或者,您应该使用LinkedHashSet
根据广告订单为您提供有序的订单
答案 1 :(得分:0)
Set.iterator()
返回java.lang.Iterator
。此迭代器仅提供删除当前元素和迭代转发的方法。
因此,如果您不想仅使用Iterator
转换套装,则无法移除上一个元素。
例如,您可以做的是收集要删除的元素,在遍历整个集合之后,删除收集的元素,例如,与Set.removeAll(removableCollection)
:
List<MyObject> removableList = new ArrayList<>();
MyObject previous;
Iterator<MyObject> itr = mySet.iterator();
while (itr.hasNext()) {
MyObject current = itr.next();
// If you find you want to remove the previous element:
if (someCondition)
removableList.add(previous);
previous = current;
}
mySet.removeAll(removeableList);
答案 2 :(得分:0)
考虑到你所说的限制因素,我不认为这个问题有解决办法。
Iterator.remove()
方法只会移除“当前”元素。HashSet
中删除。您建议的三种方法(但随后被排除在外)都可行。我认为第二个将是最高效的。
另一个想法是实现一个新的基于哈希表的Set
类型,其中Iterator
具有额外的删除操作。 (您可以从HashSet
等的源代码开始,重命名该类,然后对其进行修改以执行您所需的操作。)