草庐IT

V_Iterator

全部标签

java - 集合 - Iterator.remove() 与 Collection.remove()

根据太阳,"Iterator.removeistheonlysafewaytomodifyacollectionduringiteration;thebehaviorisunspecifiediftheunderlyingcollectionismodifiedinanyotherwaywhiletheiterationisinprogress."我有两个问题:是什么让这个操作“Iterator.remove()”比其他操作更稳定?如果“Collection.remove()”方法在大多数用例中都没有用,他们为什么要提供该方法? 最佳答案

Java Iterator 实现 - next() 和 hasNext() 执行顺序

我有一个java.util.Iterator的实现,它要求对next()的调用应该始终通过对hasNext()的调用来进行。(这是因为在多线程环境中结果是异步返回的,并且永远不清楚可能还有多少结果)。在JavaDoc中正确记录这一点,然后在违反时抛出RuntimeException是否“正确”?或者这是否将Iterator接口(interface)延伸得太远了一点?所有的想法都得到了赞赏? 最佳答案 我可能在这里遗漏了一些东西,但为什么不在您的实现内部调用hasNext()? 关于Jav

java - 为什么java Iterator接口(interface)应该实现为内部类?

我最近看了一本书《TheJavaTutorials》第三版。如图所示,它讲的是内部类实现。在第3段中,它说“Stack类本身不应实现Iterator接口(interface),因为...”。我找不到Stack类不应该实现Iterator的任何理由。给出的原因并不普遍。你能解释一下吗? 最佳答案 从根本上说,迭代器是有状态的-它需要知道它在集合中指向的何处。这不属于集合本身的一部分——给出的解释是正确的……完全有可能有两个独立的迭代器对象,迭代同一个集合对象。如果集合本身实现了Iterator接口(interface),您将如何建模?

java - 是什么导致了 java.util.HashSet 和 HashMap.keySet() 类的 iterator() 排序有点不可预测?

六年前,我花了几天时间试图找出我的完美确定性框架随机响应的位置。在仔细检查整个框架确保它都使用相同的Random实例之后,我继续通过单步执行代码进行检查。这是高度重复的迭代自调用代码。更糟糕的是,该死的效果只有在完成大量迭代后才会出现。在+6小时后,当我在javadoc中发现HashSet.iterator()的一行表明它不能保证返回元素的顺序时,我终于束手无策。然后,我检查了我的整个代码库,并将HashSet的所有实例替换为LinkedHashSet。低看,我的框架突然变成了确定性的生活!啊!我现在又一次经历了同样的FREAKIN影响(至少这次只有3个小时)。无论出于何种原因,我都错

java - 为什么 iterator.remove() 被描述为可选操作?

我浏览了Iterator.remove()的文档(http://java.sun.com/javase/6/docs/api/java/util/Iterator.html)remove()被描述为voidremove()Removesfromtheunderlyingcollectionthelastelementreturnedbytheiterator(optionaloperation).Thismethodcanbecalledonlyoncepercalltonext.Thebehaviorofaniteratorisunspecifiediftheunderlyingco

java - 采访 : Design an iterator for a collection of collections

为java中的集合设计一个迭代器。迭代器应该隐藏嵌套,允许您迭代属于所有集合的所有元素,就好像您在处理单个集合一样 最佳答案 这是一个老问题,但如今(2019年)我们有了JDK8+好东西。特别是,我们有流,这使得这个任务变得简单:publicstaticIteratorflatIterator(Collection>collections){returncollections.stream().filter(Objects::nonNull).flatMap(Collection::stream).iterator();}我正在过滤

java - 公开内部集合项时应该使用 Iterator 还是 Iterable?

我有一个带有私有(private)可变数据列表的类。我需要在以下条件下公开列表项:列表不应在外部修改;使用getter函数的开发人员应该清楚,他们获得的列表无法修改。应将哪个getter函数标记为推荐方法?或者你能提供更好的解决方案吗?classDataProcessor{privatefinalArrayListsimpleData=newArrayList();privatefinalCopyOnWriteArrayListcopyData=newCopyOnWriteArrayList();publicvoidmodifyData(){...}publicIterablegetU

java - List Iterator的add()方法对迭代器做了什么?

我希望能够向ArrayList中插入元素使用ListIterator,但不知何故,即使在阅读了与ListIterator的添加方法相关的文档后,我仍然感到困惑类,如果我做这样的事情for(inti=0;i这段代码片段对我的列表迭代器做了什么,它把列表迭代器移到了哪里?当我运行以下代码时,我得到的结果是“Hi”-:importjava.util.ArrayList;importjava.util.ListIterator;publicclassListIter{publicstaticvoidmain(String[]args){String[]s={"Hi","I","am","Ank

java - 包含 Iterable 和 Iterator 的方法?

是否有一种简单的方法来检查元素是否包含在可迭代对象或迭代器中,类似于Collection.contains(Objecto)方法?即而不是必须写:Iterabledata=getData();for(finalStringname:data){if(name.equals(myName)){returntrue;}}我想写:Iterabledata=getData();if(Collections.contains(data,myName)){returntrue;}我真的很惊讶没有这样的东西。 最佳答案 在Java8中,您可以将I

c++ - Erase-remove 习语 : what happens when remove return past-the-end-iterator?

我在阅读ScottMeyers的erase-removeidiom(第32项)时遇到了这个问题"EffectiveSTL”书。vectorv;...v.erase(remove(v.begin(),v.end(),99),v.end());remove基本上返回“新逻辑结束”和原始范围的元素,这些元素从范围的“新逻辑结束”开始并继续直到范围的真正结束是要删除的元素从容器中删除。听起来不错。现在,让我问我的问题:在上面的例子中,如果vectorv中没有找到99,remove可以返回v.end()。它基本上是将past-the-end-iterator传递给erase方法。当past-th