Tag: 迭代器

为什么在一个线程迭代(使用Iterator)和其他线程修改非线程安全的ArrayList的相同副本时没有ConcurrentModificationException

一些背景: 当使用Iterator一个集合时,可能会有java.util.ConcurrentModificationException因为在创建Iterator对象的时候,会捕获集合或ArrayList的修改计数( modCount ),并在每次迭代时使用Iterator.next()它检查modCount是否已更改,如果是,则抛出java.util.ConcurrentModificationException 。 在创建迭代器对象时(来自ArrayList的Iterator实现): int expectedModCount = modCount; 下面的方法在Iterator.next()调用,它抛出exception(来自ArrayList的Iterator实现): final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } 我可以使用下面的代码很好地重现它: List stringList = new ArrayList(); stringList.add(“a”); stringList.add(“b”); stringList.add(“c”); Iterator iterator = stringList.iterator(); System.out.println(“Got iterator object”); while (iterator.hasNext()) { String player = iterator.next(); player.toString(); System.out.println(“UpperCase: ” + player.toUpperCase()); iterator.remove(); stringList.add(“a1”); //This is […]

Clojure和HBase:通过扫描迭代懒惰

假设我想在clojure中打印hbase表扫描的输出。 (defmulti scan (fn [table & args] (map class args))) (defmethod scan [java.lang.String java.lang.String] [table start-key end-key] (let [scan (Scan. (Bytes/toBytes start-key) (Bytes/toBytes end-key))] (let [scanner (.getScanner table scan)] (doseq [result scanner] (prn (Bytes/toString (.getRow result)) (get-to-map result)))))) get-to-map将结果转换为地图。 它可以像这样运行: (hbase.table/scan table “key000001” “key999999”) 但是,如果我想让用户对扫描结果做些什么呢? 我可以允许它们将函数作为回调函数传递给每个结果。 但我的问题是:如果我希望用户能够懒散地迭代每个结果,我会返回什么 (Bytes/toString (.getRow result)) (get-to-map result) 而不是保留以前的结果,就像在lazy-seq的简单化中所发生的那样。

我们可以使用for-each循环来迭代Iterator类型的对象吗?

如果我们执行以下操作,则会收到错误: class FGH{ public static Iterator reverse(List list) { Collections.reverse(list); return list.iterator(); } public static void main(String[] args) { List list = new ArrayList(); list.add(“1”); list.add(“2”); list.add(“3”); /*for(Iterator it:reverse(list)) Iterator it=reverse(list);*/ for (Object obj: reverse(list)) System.out.print(obj + “, “);}} 但是如果我们像这样修改代码我们就不会得到错误,那么它是否意味着我们不能迭代Iterator类型的对象? : class FGH{ public static Iterator reverse(List list) { Collections.reverse(list); return list.iterator(); } public static […]

我应该使用Iterator还是forloop进行迭代?

我不喜欢不得不调用hasNext()和next()的想法,并且看到我如何需要一个循环来调用它们,我真的没有看到使用在列表中给我们的迭代器和地图。 是否只需要从列表中提取一个? 或者,如果您从列表中选择一个项目,并且必须在不可测量的时间内执行此操作? 我在Google或Stack上找不到这个,请帮帮我。 我不是专门讨论增强的for循环(for-each循环)。 我也理解foreach循环在性能方面表现优异,但这更像是“为什么存在”的问题 编辑:已经实现我只谈论集合而不是arraysaswel。 Foreach循环在这种情况下没有限制。

迭代二维Java数组

public static List<Vertex> petersenGraph() { List<Vertex> v = new ArrayList<Vertex>(); for (int i = 0; i < 10; i++) { v.add(new Vertex(i)); } int[][] edges = {{0,1}, {1,0}, {1,2}, {2,1}, {2,3}, {3,2}, {3,4}, {4,3}, {4,0}, {0,4}, {5,6}, {6,5}, {6,7}, {7,6}, {7,8}, {8,7}, {8,9}, {9,8}, {9,5}, {5,9}, {5,0}, {0,5}, {6,2}, {2,6}, {7,4}, {4,7}, {8,1}, {1,8}, {9,3}, […]

Iterator接口方法在哪里有hasNext(),next(),remove()定义? 因为接口永远不会定义方法只声明

Iterator接口方法在哪里定义了hasNext(),next(),remove()等? 接口不定义方法,只声明在其他类中定义的方法。 我们如何通过Iterator引用直接访问hasnext(),next()等方法? 例如: List l = new LinkedList(); l.add(1); l.add(2); Iterator iter = l.iterator(); while(iter.hasNext()) { Object o = iter.next(); System.out.println(o); } 在上面的示例中,使用引用iter(Iterator引用)可以在iter引用中分配任何方法吗? 请给我一个代码示例。 直到现在我才能理解这个概念。

是否可以在Java中扩展迭代器的function?

我想知道是否有一种方法来扩展迭代器接口的function。 假设我们有一个实现Iterable接口的Class(在上面的例子中,我没有添加myFunction的Iterator接口的重写函数)。 public class MyClass implements Iterable{ @Override public Iterator iterator() { return new Iterator() { @Override public boolean hasNext() { throw new UnsupportedOperationException(“Not supported yet.”); } @Override public Tuple next() { throw new UnsupportedOperationException(“Not supported yet.”); } @Override public void remove() { throw new UnsupportedOperationException(“Not supported yet.”); } public void myFunction(){ } }; } […]

迭代器用Java读取和处理文件

假设我有一个Point类和一个处理Point实例的函数 class Point {private final int x,y; …} … void handlePoints(Iterable points){for(Point p:points){…}} 现在我想从文件中读取points 。 该文件的每一行包含两个数字,因此我有一个函数(“工厂方法”)来从一行创建一个point 。 点makePoint(String line){…} 我现在应该怎么做? 我可以编写一个函数来将文件读取到一个points列表并调用handlePoints函数。 List readPoints(BufferedReader reader){…} //在这里使用makePoint void handlePoints(BufferedReader reader){ List points = readPoints(reader); handlePoints(分); } 不幸的是,这个function似乎并不特别优雅,因为它在内存中创建了一个不必要的点列表。 使用迭代器不是更好吗? void handlePoints(Iterator points){…} Iterator readPoints(BufferedReader reader){…} //在这里使用makePoint void handlePoints(BufferedReader reader){ Iterator points = readPoints(reader); handlePoints(分); } 是否有意义? 这段代码在Java中不会太“吵”吗?

嵌套迭代遍历列表,然后是最终删除

我试图通过循环遍历列表(嵌套循环)迭代。 考虑以下代码: ArrayList list = new ArrayList(); // add some values to it for(int i : list) { // ConcurrentModificationException Iterator iterator = list.iterator(); while(iterator.hasNext()) { int n = iterator.next(); if(n % i == 0) { iterator.remove(); } } } 上面的示例导致ConcurrentModificationException。 当然,移除元素的条件只是一个例子。 我确定我只是遗漏了一些东西; 但是我应该如何构建一个在Java 中实现相同function而不会抛出exception的循环 ?

通过Java中的ArrayLists的ArrayList进行迭代

我有以下ArrayList … ArrayList<ArrayList> row1 = new ArrayList<ArrayList>(); 以下arraylists添加到它…. row1.add(cell1); row1.add(cell2); row1.add(cell3); row1.add(cell4); row1.add(totalStockCell); 我想遍历arraylist row1并打印内容。 循环中的循环会在这里工作吗? 例如 while(it.hasNext()) { //loop on entire list of arraylists while(it2.hasNext) { //each cell print values in list } }