【问题标题】:How to iterate a list inside a list in java?如何在java中的列表中迭代列表?
【发布时间】:2014-10-15 20:36:34
【问题描述】:

您好,我有两个值对象类。

package org.array;

import java.util.List;



public class Father {

    private String name;
    private int age ;
    private List<Children> Childrens;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public List<Children> getChildrens() {
        return Childrens;
    }
    public void setChildrens(List<Children> childrens) {
        Childrens = childrens;
    }


}

第二个是给孩子的

package org.array;

public class Children {

    private String name;
    private int age ;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }


}

我想在那里打印值,我在列表中嵌套了一个列表,在这里我只在对象中放置一个值,而实际上我有很多值。所以我在父亲列表中嵌套了孩子的列表。我如何打印或获取孩子和父亲的价值。这是我的逻辑。

package org.array;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ArrayDemo {

    public static void main(String[] args) {
         List <Father> fatherList = new ArrayList<Father>();
        Father father =  new Father();
        father.setName("john");
        father.setAge(25);
        fatherList.add(father);

         List <Children> childrens = new ArrayList<Children>();
         Children children = new Children();
        children.setName("david");
        children.setAge(2);
        childrens.add(children);
        father.setChildrens(childrens);
        fatherList.add(father);

        Iterator<Father> iterator = fatherList.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.toString());
        }



        }
        }

【问题讨论】:

  • 作为注释,您似乎将father 添加到fatherList 两次。我不确定这是否是故意的。这超出了问题的范围,但可能会在以后引起您的困惑。
  • 你是正确的马克谢谢你的建议
  • @user2142786 使用 foreach 循环而不是迭代器 bcoz 迭代器有点慢

标签: java list arraylist iterator


【解决方案1】:

使用 Java 8 forEach 遍历 List。

{
            List<Father> fatherList = new ArrayList<Father>();
            // Create Father Object
            Father father = new Father();
            father.setName("john");
            father.setAge(25);
            List<Children> childrens = new ArrayList<Children>();
            // Create child object
            Children children = new Children();
            children.setName("david");
            children.setAge(2);
            childrens.add(children);
            father.setChildrens(childrens);
            fatherList.add(father);
            fatherList.forEach(f -> {
                System.out.println("Father's Name : " + f.getName());
                f.getChildrens().forEach(c -> {
                    System.out.println("Children's Name : " + c.getName());
                });
            });
        }

【讨论】:

    【解决方案2】:

    只是为了打印对象,你可以使用下面的代码 sn-p

           for (Father father2 : fatherList) {
                System.out.print("Father: "+ReflectionToStringBuilder.toString(father2));
                for (Children children2 : childrens) {
                    System.out.print(" Children: " + ReflectionToStringBuilder.toString(children2));
                }
                System.out.println();
            }
    

    【讨论】:

      【解决方案3】:

      在父亲和孩子中重写 toString()。您的父亲的 toString() 实现应该使用 children.toString() 来构建结果字符串,就是这样。然后打印父亲将打印父亲和孩子的详细信息。

      toString() 的子实现

      public String toString() {
      StringBuffer buff = new StringBuffer();
          buff.append("[Name : ");
          buff.append(this.name).append(", Age : ");
          buff.append(this.age);
          buff.append("]");
          return buff.toString();
      }
      

      toString() 的父实现

      @Override
      public String toString() {
          StringBuffer buff = new StringBuffer();
          buff.append("[ Father Name : ");
          buff.append(this.name);
          buff.append(", Age : ");
          buff.append(this.age);
          buff.append(", Childrens : { ");
          for (Children children : getChildrens()) {
              buff.append(children);
              buff.append(" ");
          }
          buff.append("}");
          return buff.toString();
      }
      

      然后打印Father会同时打印出Father和Children的信息。

      System.out.println(father);
      

      【讨论】:

      • 能否详细定义一下
      • 我对此有点不以为然,但 toString 不应该仅仅为了提供“显示”数据而被覆盖,这就是格式化程序的用途,相反,toString 应该用于提供关于对象状态的有用信息,尤其是用于调试 - 但这只是我......
      • @jdphenix - 你是对的,但它不允许我添加新评论,因为我的声誉非常低。
      • @MadProgrammer Ohhh...我再次阅读后才意识到这个答案在说什么。
      • @MadProgrammer - 对,但是像这样的 POJO 类不维护任何状态。这里的目的是避免嵌套循环的开销。
      【解决方案4】:

      您可以使用嵌套的for 循环来完成此操作。这是一个例子:

      for (Father f : fatherlist) {
          System.out.println("Father: " + f.getName());
          System.out.println("Children:");
          for (Children c : f.getChildrens()) {
              System.out.println(c.getName());
          }
      }
      

      使用Iterator 方法,您可以这样完成:

      Iterator<Father> i = fatherList.iterator();
      while (i.hasNext()) {
          Father f = i.next();
          System.out.println("Father: " + f.getName());
          System.out.println("Children:");
          Iterator<Children> ci = f.getChildrens().iterator();
          while (ci.hasNext()) {
              Children c = ci.next();
              System.out.println(c.getName());
          }
      }
      

      作为一般的风格建议,我建议将Children 类重命名为Child,并将Father 中的方法getChildrenssetChildrens 分别重命名为getChildrensetChildren

      我什至建议更进一步,删除setChildren 方法并提供addChild(Child child) 方法,这样您就可以控制包含孩子的List。这样做的一个好处是,您可以保证 List 被实例化,这样您定义的这些循环不会在没有子级添加到特定 Father 实例的情况下遇到 NullPointerException

      【讨论】:

        【解决方案5】:

        您可以使用advance forloop 来迭代(相当于使用iterator)子ArrayList 和父ArrayList

        样本:

         for(Father  f : fatherList)
         {
            for(Children c : f.getChildrens)
            {
        
            }
         }
        

        【讨论】:

          【解决方案6】:

          简单地使用两个 for 循环

          for (Father f : fatherlist) {
              for (Children c : f.getChildrens) {
              }
          }  
          

          【讨论】:

            【解决方案7】:
            Iterator<Father> iterator = fatherList.iterator();
                    while (iterator.hasNext()) {
                       Father father = iterator.next();
                          Iterator<Children> childiter = father.getChildren().iterator();
                          while(childiter.hasNext()){
                              System.out.println(childiter.next().toString());
                           }
            
                    }
            

            【讨论】:

            • 嗨,它必须是 getChildrens.iterator()
            • 嗨,这在语法上是不正确的。我建议更改您的函数名称
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多