【问题标题】:Print all elements of an Arraylist of List/String type打印 List/String 类型的 Arraylist 的所有元素
【发布时间】:2019-05-17 14:11:12
【问题描述】:

我需要打印ArrayList 的每个元素。这个ArrayList 可以是ArrayListString 类型。此列表的其他子级也可以是列表类型。

这是我写到现在的:

public class Logic extends AppCompatActivity {

    ArrayList<Object> parent = new ArrayList<>();
    ArrayList<Object> check = new ArrayList<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        parent.add("list 1");
        check.add("list 2");
        check.add(parent);
        parent.add(check);

        for (int i = 0; i < parent.size(); i++) {
            if (!(parent.get(i) instanceof ArrayList)) {
                Log.e("test",(String) parent.get(i));
            } else {
                printDetails((ArrayList<?>) parent.get(i));
            }
        }
    }

    public synchronized void printDetails(ArrayList<?> child) {
        for (int i = 0; i < child.size(); i++) {
            if (!(child.get(i) instanceof ArrayList)) {
                Log.e("test1", (String) child.get(i));
            } else {
                printDetails((ArrayList<?>) child.get(i));
            }
        }
    }
}

但这会打印所有突然的值,没有任何预期的顺序。期望是所有值都应该连续打印。就像如果列表的第一个元素是字符串,它应该首先打印字符串,否则如果它是一个列表,如果应该打印这个子列表的所有值,如果子列表的任何元素再次是列表,它也应该打印这些值并移动返回父列表的下一个元素。

如果这是输入:

ArrayList<Object> parent = new ArrayList<>();
ArrayList<Object> child1 = new ArrayList<>();
ArrayList<Object> subChild1= new ArrayList<>();
ArrayList<Object> nestedSubChild1= new ArrayList<>();

parent.add("list 1");
parent.add("list 1-2");


child1.add("childlist 2");
subChild1.add("sublist 1-1");
subChild1.add("sublist 1-2");
nestedSubChild1.add("nestedlist 1-1");
nestedSubChild1.add("nestedlist 1-2");
subChild1.add(nestedSubChild1);
child1.add(subChild1);
parent.add(child1);

我想要这个输出

list 1
list 1-2
childlist 2
sublist 1-1
sublist 1-2
nestedlist 1-1
nestedlist 1-2

另一个要求是使用递归,以便代码高效。

【问题讨论】:

  • 你有check.add(parent),然后是parent.add(check)。这会创建循环引用。这是故意的吗?
  • @PrasadKarunagoda 这仅用于测试目的。这不会实时发生。

标签: java android arraylist logic


【解决方案1】:

您可以通过创建一个递归方法来打印出 列表

public static void printRecursiveList(List myList) {
    for (Object obj : myList) {
        if (obj instanceof List) {
            printRecursiveList((List) obj); // call itself again since its a list
        } else {
            System.out.println(obj);
        }
    }
}

现在你可以调用它了:

parent.stream().forEach(i -> {
    if (i instanceof List) {
        printRecursiveList((List) i);
    } else {
        System.out.println(i);
    }
});

在这里,我们通过列表parent 进行流式传输,如果元素是列表的实例,我们调用printRecursiveList(...),否则我们打印出该元素。

【讨论】:

  • 理解 wt 我的代码有问题。谢谢尼古拉斯K
【解决方案2】:

您可以通过覆盖对象的toString() 方法来打印Model 类的所需元素。
支持你得到和Child 类的ArrayList,即ArrayList&lt;Child&gt;
- toString() 可以这样实现:

class Child {

    private String name;
    .... some other variable

    @Override
    public String toString() {
        return "Name: "  + name + ": last updated: " +lastUpdated;
    }
}

现在,当你打印 child.toString() 时,它会像你想打印的那样打印结果。

【讨论】:

    【解决方案3】:

    我使用静态变量测试了您的代码,它按您的预期编译。见下文:

    import java.util.ArrayList;
    import java.util.*;
    public class MyClass {
        static ArrayList<Object> parent = new ArrayList<>();
        static ArrayList<Object> check = new ArrayList<>();
        static ArrayList<Object> check2 = new ArrayList<>();
    
        public static void main(String args[]) {
    
            parent.add("list 1");
            parent.add("list 2");
            check.add("list 3");
            check2.add("list 4");
            check2.add("list 5");
            check2.add("list 6");
            check.add(check2);
            //check.add(parent);
            parent.add(check);
    
            System.out.println(Arrays.deepToString(parent.toArray()));
            System.out.println("-------");
            for (int i = 0; i < parent.size(); i++) {
                if (!(parent.get(i) instanceof ArrayList)) {
                    System.out.println("firstPart -> " + (String) parent.get(i));
                }
                else {
                    printDetails((ArrayList<?>) parent.get(i));
                }
            }
        }
        public static void printDetails(ArrayList<?> child) {
            for (int i = 0; i < child.size(); i++) {
                if (!(child.get(i) instanceof ArrayList)) {
                    System.out.println("lastPart -> " + (String) child.get(i));
                } else {
                    printDetails((ArrayList<?>) child.get(i));
                }
            }
        }
    }
    

    但我发现当我取消注释块“check.add(parent);”时,它会创建嵌套循环,生成 java.lang.StackOverflowError。

    顺便说一句,你可以使用

    Arrays.deepToString(parent.toArray());
    

    仅按顺序记录值的方法。

    【讨论】:

    • 顺序无关紧要。我只想打印父列表的所有值。
    【解决方案4】:

    试试这个。它应该可以工作。

    import java.util.ArrayList;
    
    public class PrintArrayList
    {
      public static void main(String[] args)
      {
        ArrayList<Object> parent = new ArrayList<>();
        ArrayList<Object> child1 = new ArrayList<>();
        ArrayList<Object> subChild1= new ArrayList<>();
        ArrayList<Object> nestedSubChild1= new ArrayList<>();
    
        parent.add("list 1");
        parent.add("list 1-2");
    
    
        child1.add("childlist 2");
        subChild1.add("sublist 1-1");
        subChild1.add("sublist 1-2");
        nestedSubChild1.add("nestedlist 1-1");
        nestedSubChild1.add("nestedlist 1-2");
        subChild1.add(nestedSubChild1);
        child1.add(subChild1);
        parent.add(child1);
    
        print(parent);
      }
    
      public static void print(ArrayList<Object> arrayList)
      {
        for (Object element : arrayList)
        {
          if (element instanceof ArrayList)
          {
            print((ArrayList) element);
          }
          else
          {
            System.out.println(element);
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 2014-06-29
      • 2023-03-08
      相关资源
      最近更新 更多