【问题标题】:Recursive method with ArrayListArrayList 的递归方法
【发布时间】:2016-08-18 01:39:09
【问题描述】:

我在编程课的练习中遇到了一些麻烦。

我有这样的课:

类的UML

我必须创建一个公共方法,从一个扇区返回子扇区的总数。

这是整个班级的代码:

public class Sector {

private int number;
private String name;
private String type;

private ArrayList<Sector> sectors = new ArrayList<>();   

public Sector(int number, String name, String type) {
    this.number = number;
    this.name = name;
    this.type = type;
}

而递归方法是这样的

public ArrayList<Sector> getTotalSectors(Sector sector, ArrayList<Sector> sectors) {                    
    sectors.add(this);            
        if (sector.getSectors() != null) {
            for(Sector sector1 : sector.getSectors()) {
                getTotalSectors(sector1, sectors);
            }
        }        
    return sectors;
}

但我不能让它工作,当我尝试调用 main 中的方法时,我得到了这个

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)

** 主类 **

Sector s1 = new Sector(100, "sales", "sales");
    Sector s1_1 = new Sector (101, "minor sales", "minor");
    Sector s1_2 = new Sector (102, "mayor sales", "mayor");
    Sector s1_2_1 = new Sector (102, "lala sales", "lalala");

    s1.getSectors().add(s1_1);
    s1.getSectors().add(s1_2);
    s1_2.getSectors().add(s1_2_1);

s1.getTotalSectors(s1, s1.getSectors());

知道我做错了什么吗?

【问题讨论】:

  • 我无法理解您要执行的操作。但是您不能同时使用 for-each 循环遍历集合并使用 add 方法对其进行修改。也许你需要重新设计它。
  • 您正在遍历 arrayList 并同时修改它,不能这样做。而不是 for 循环,使用迭代器
  • "返回子扇区总数的公共方法"你想获取计数还是创建一个包含所有子扇区的新 ArrayList 变量。
  • 它必须返回一个包含一个扇区的所有子扇区的ArrayList,但同时一个子扇区可以有多个子扇区
  • 例如:sector1 扇区1_1 扇区1_2 扇区1_2_1 如果我使用扇区1的方法,它应该返回一个包含3个对象(扇区1_1,扇区1_2,扇区1_2_1)的数组列表

标签: java recursion arraylist


【解决方案1】:

在您的 getTotalSectors 方法中,将 if 结构中的 for 循环替换为以下代码。如果您使用 Iterator 类,则不应发生异常。

   Iterator<Sector> iter = sectors.iterator();
    while (iter.hasNext()) {
    Sector sector1=iter.next();
    getTotalSectors(sector1, sectors);
   }

【讨论】:

  • 我收到了 StackOverflowError 问题
  • 您能展示一下 getTotalSectors 方法的代码吗?
  • paste.ubuntu.com/23066029 抱歉,我不能在 cmets 上以“易于阅读”的格式发布它,stackoverflow 上的新功能
  • 如果不给变量赋值,为什么还要在while语句中调用getTotalSectors方法?
  • 当然你会得到一个StackOverflowError。第一次调用getTotalSectors 时,您将传递s1s1 中的列表。该方法所做的第一件事是将s1 添加到它自己的列表中。然后,当您完成for 循环时,您将对getTotalSectors 进行的一次调用将具有相同的两个参数。这就是你的StackOverflowError。因此,按照您设计getTotalSectors 的方式,传递Sector 和同一Sector 内的列表是无效的。如果你需要这样做,那么你需要重新设计方法。
猜你喜欢
  • 2017-08-22
  • 2014-12-17
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2021-08-09
相关资源
最近更新 更多