[英]How to remove an element from set using Iterator?
我有一种情况,我正在使用迭代器遍历集合。 现在,我想在迭代器位于第二个元素上时删除第一个元素。 我该怎么做。 我知道Set是无序的,没有像第一个或第二个元素一样的东西,但是我的问题是我想删除Iterator.next当前未返回的元素
我不想将此设置转换为列表并使用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
}
HashSet是无序的,并且javadoc明确声明Iterator的remove方法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
,它根据插入顺序为您提供有序的Set
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);
考虑到您所说的限制,我认为没有解决问题的办法。
Iterator.remove()
方法将仅删除“当前”元素。 HashSet
中删除。 您建议(但随后排除)的三种方法都可以使用。 我认为第二名将是表现最好的。
另一个想法是实现一个新的基于哈希表的Set
类型,该类型具有一个带有额外删除操作的Iterator
。 (您可以从HashSet
等的源代码开始,重命名该类,然后对其进行修改以执行您需要的操作。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.