【问题标题】:Adding, removing and printing from ArrayList with Iterator使用迭代器从 ArrayList 添加、删除和打印
【发布时间】:2014-01-14 05:45:48
【问题描述】:

首先我想说我知道其他更容易和更好的循环用于这种工作,但我只是想用迭代器练习一下。所以,我正在循环一个 ArrayList,我想用迭代器在其中添加和删除元素,但是当我运行程序时,屏幕上没有输出。这就是我所拥有的:

public class Orders { 
    ArrayList<String> list = new ArrayList<>();
    Iterator it = list.iterator();

    public void addOrder(String s) {
        while(it.hasNext()){
            String st = (String) it.next();
            if(s.equals(st)){
                System.out.println("The order '"+s+"' already exists.");
            }
            else{
                list.add(s);
                System.out.println("Order '"+s+"' was added.");
            }
        }

    }

    public void deleteOrder(String s) {
        while(it.hasNext()){
            String st = (String) it.next();
            if(s.equals(st)){
                list.remove(s);
                System.out.println("The order '"+s+"' was deleted succesfully.");
            }
            else{
                System.out.println("The order '"+s+"' was not found.");
            }
        }
    }

    public void showList(){
        while(it.hasNext()){
            String st = (String) it.next();
            System.out.println("Order: '"+st+"'. \n");
        }
    }
}



public class RemoveOrder {

  private Orders ord;
  public RemoveOrder( Orders o ) {
    ord = o;
  }
  public void remove() {  
      ord.deleteOrder( "jk123" );
      ord.deleteOrder( "jk125" );
      ord.showList();
  }
}


public class AddOrder {

    private Orders ord;

    public AddOrder( Orders o ) {
        ord = o;
    }

    public void add() {
        ord.addOrder( "jk123" );
        ord.addOrder( "jk124" );
        ord.addOrder( "jk125" );
        ord.addOrder( "jk126" );
        ord.showList();
    }
}


public class IteratorRun implements Runnable {


    Orders ord = new Orders();
    AddOrder ao = new AddOrder(ord);
    RemoveOrder ro = new RemoveOrder(ord);

    public void run() {
        try {
            ao.add();
            ro.remove();
        } catch (Exception e) {
        }
    }
}

主要是:

Thread t1 = new Thread(new IteratorRun());
t1.start();

【问题讨论】:

标签: java arraylist iterator


【解决方案1】:

我已更新订单代码

  1. 您需要从列表中重新启动迭代器,因为列表获取 修改
  2. 检查列表中是否已经存在的值的逻辑是 修改。
import java.util.ArrayList; import java.util.Iterator; public class Orders { ArrayList list = new ArrayList(); Iterator it = null; public void addOrder(String s) { it = list.iterator(); while(it.hasNext()){ String st = (String) it.next(); if(s.equals(st)){ System.out.println("The order '"+s+"' already exists."); return; } } list.add(s); System.out.println("Order '"+s+"' was added."); } public void deleteOrder(String s) { it = list.iterator(); while(it.hasNext()){ String st = (String) it.next(); if(s.equals(st)){ list.remove(s); System.out.println("The order '"+s+"' was deleted succesfully."); return ; } } System.out.println("The order '"+s+"' was not found."); } public void showList(){ it = list.iterator(); while(it.hasNext()){ String st = (String) it.next(); System.out.println("Order: '"+st+"'. \n"); } } }

【讨论】:

  • 哇,真是个魅力。谢谢一堆。它从来没有让我重新启动迭代器。在我看来,迭代器需要这么多的吹毛求疵,不值得麻烦
【解决方案2】:
  1. 在 addOrder 中检查 it.hasNext()。第一次数组列表为空并且 因此 it.hasNext 将是错误的。
  2. 如果我们在使用迭代器时尝试向 araylist 添加值,它会 抛出 java.util.ConcurrentModificationException

在大多数地方存在类似的代码 addOrder/deleteOrder 这将导致此异常。

示例:以下代码将抛出 ConcurrentModificationException。

 ArrayList al = new ArrayList();
    al.add("test");
    Iterator iter = al.iterator();
    while(iter.hasNext()) {
        System.out.println(iter.next());
        al.add("test");
    }

【讨论】:

  • 是的,我对此进行了研究并尝试了许多其他方法,但我只让“添加”部分工作,“删除”工作一次又一次,我没有输出。在我看来迭代器并不值得花时间,但我只是想玩一下它
猜你喜欢
  • 2020-03-18
  • 2012-11-30
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多