打印 List/String 类型的 Arraylist 的所有元素
Posted
技术标签:
【中文标题】打印 List/String 类型的 Arraylist 的所有元素【英文标题】:Print all elements of an Arraylist of List/String type 【发布时间】:2019-05-17 14:11:12 【问题描述】:我需要打印ArrayList
的每个元素。这个ArrayList
可以是ArrayList
或String
类型。此列表的其他子级也可以是列表类型。
这是我写到现在的:
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 这仅用于测试目的。这不会实时发生。
【参考方案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<Child>
:
- 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.***Error。
顺便说一句,你可以使用
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);
【讨论】:
以上是关于打印 List/String 类型的 Arraylist 的所有元素的主要内容,如果未能解决你的问题,请参考以下文章
不支持的文字类型类 scala.collection.immutable.Nil$ List()