打印列表/字符串类型的数组列表的所有元素

时间:2018-12-17 08:28:38

标签: java android arraylist logic

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

这是我到目前为止所写的:

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

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

4 个答案:

答案 0 :(得分: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(...),否则我们将打印出该元素。

答案 1 :(得分:0)

您可以通过重写Object的Model方法来打印toString()类的必需元素。
支持您获得ArrayList类的Child,即ArrayList<Child>
-toString()的实现方式如下:

class Child {

    private String name;
    .... some other variable

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

现在,当您打印child.toString()时,它会像打印结果一样打印结果。

答案 2 :(得分:0)

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

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());

如果仅按顺序记录值的方法。

答案 3 :(得分:0)

尝试一下。应该可以。

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);
      }
    }
  }
}