如何在Java中打印List的所有元素?
我试图打印List
所有元素,但它是打印Object
的指针而不是值。
这是我的打印代码…
for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); }
任何人都可以请帮助我为什么不打印元素的价值。
下面是关于打印出列表组件的一些例子:
public class ListExample { public static void main(String[] args) { List<Model> models = new ArrayList<>(); // TODO: First create your model and add to models ArrayList, to prevent NullPointerException for trying this example // Print the name from the list.... for(Model model : models) { System.out.println(model.getName()); } // Or like this... for(int i = 0; i < models.size(); i++) { System.out.println(models.get(i).getName()); } } } class Model { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
下面是紧凑的,并避免在您的示例代码中的循环(并给你很好的逗号):
System.out.println(Arrays.toString(list.toArray()));
但是,正如其他人所指出的那样,如果您没有为列表中的对象实现明智的toString()方法,您将获得您正在观察的对象指针(实际上是哈希码)。 这是真的,无论他们是否在列表中。
从Java 8开始,Listinheritance了一个默认的“forEach”方法,您可以像这样将其与方法引用“System.out :: println”结合使用:
list.forEach(System.out::println);
Java 8 Streams方法…
list.stream().forEach(System.out::println);
System.out.println(list);//toString() is easy and good enough for debugging.
toString()
的AbstractCollection
将是干净和容易的,做到这一点 。 AbstractList
是AbstractList
的子类, 所以不需要for循环,也不需要toArray()。
返回此集合的string表示forms。 string表示由集合元素的列表组成,它们按其迭代器返回的顺序包含在方括号中(“[]”)。 相邻的元素由字符“,”(逗号和空格)分隔。 通过String.valueOf(Object)将元素转换为string。
如果您在列表中使用任何自定义对象,请说学生,您需要重写它的toString()
方法(重写此方法总是好的)以获得有意义的输出
看下面的例子:
public class TestPrintElements { public static void main(String[] args) { //Element is String, Integer,or other primitive type List<String> sList = new ArrayList<String>(); sList.add("string1"); sList.add("string2"); System.out.println(sList); //Element is custom type Student st1=new Student(15,"Tom"); Student st2=new Student(16,"Kate"); List<Student> stList=new ArrayList<Student>(); stList.add(st1); stList.add(st2); System.out.println(stList); } } public class Student{ private int age; private String name; public Student(int age, String name){ this.age=age; this.name=name; } @Override public String toString(){ return "student "+name+", age:" +age; } }
输出:
[string1, string2] [student Tom age:15, student Kate age:16]
列表中的对象必须有toString
实现,才能打印出有意义的内容。
下面是一个快速testing,看看不同之处:
public class Test { public class T1 { public Integer x; } public class T2 { public Integer x; @Override public String toString() { return x.toString(); } } public void run() { T1 t1 = new T1(); t1.x = 5; System.out.println(t1); T2 t2 = new T2(); t2.x = 5; System.out.println(t2); } public static void main(String[] args) { new Test().run(); } }
当这个执行时,打印到屏幕上的结果是:
t1 = Test$T1@19821f t2 = 5
由于T1不会覆盖toString方法,所以它的实例t1打印出来的东西不是很有用。 另一方面,T2覆盖toString,所以我们控制它在I / O中使用时打印的内容,并在屏幕上看到一些更好的东西。
通过使用java 8的function…..
import java.util.Arrays; import java.util.List; /** * @author AJMAL SHA * */ public class ForEach { public static void main(String[] args) { List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); (features).forEach(System.out::println); } }
我认为首先你需要了解发生了什么事情。
- 你没有指定列表包含哪些元素,如果它是一个基本的数据types,那么你可以打印出来的元素。
-
但是如果元素是对象,那么Kshitij Mehta提到你需要在对象中实现(覆盖)方法“toString” – 如果它没有被实现 – 让它从对象中返回完整的东西,例如:
class Person { private String firstName; private String lastName; @Override public String toString() { return this.firstName + " " + this.lastName; } }
System.out.println(list);
为我工作。
这是一个完整的例子:
import java.util.List; import java.util.ArrayList; public class HelloWorld { public static void main(String[] args) { final List<String> list = new ArrayList<>(); list.add("Hello"); list.add("World"); System.out.println(list); } }
它会打印[Hello, World]
。
list.stream().map(x -> x.getName()).forEach(System.out::println);
我写了一个转储函数,它基本上打印出一个对象的公共成员,如果它没有覆盖toString()。 人们可以很容易地扩展它来调用getter。 的Javadoc:
将给定的Object转储到System.out,使用以下规则:
- 如果对象是Iterable,它的所有组件都被转储。
- 如果Object或它的一个超类覆盖toString(),则“toString”被转储
- 否则该方法将被recursion调用,以供Object的所有公共成员使用
/** * Dumps an given Object to System.out, using the following rules:<br> * <ul> * <li> If the Object is {@link Iterable}, all of its components are dumped.</li> * <li> If the Object or one of its superclasses overrides {@link #toString()}, the "toString" is dumped</li> * <li> Else the method is called recursively for all public members of the Object </li> * </ul> * @param input * @throws Exception */ public static void dump(Object input) throws Exception{ dump(input, 0); } private static void dump(Object input, int depth) throws Exception{ if(input==null){ System.out.print("null\n"+indent(depth)); return; } Class<? extends Object> clazz = input.getClass(); System.out.print(clazz.getSimpleName()+" "); if(input instanceof Iterable<?>){ for(Object o: ((Iterable<?>)input)){ System.out.print("\n"+indent(depth+1)); dump(o, depth+1); } }else if(clazz.getMethod("toString").getDeclaringClass().equals(Object.class)){ Field[] fields = clazz.getFields(); if(fields.length == 0){ System.out.print(input+"\n"+indent(depth)); } System.out.print("\n"+indent(depth+1)); for(Field field: fields){ Object o = field.get(input); String s = "|- "+field.getName()+": "; System.out.print(s); dump(o, depth+1); } }else{ System.out.print(input+"\n"+indent(depth)); } } private static String indent(int depth) { StringBuilder sb = new StringBuilder(); for(int i=0; i<depth; i++) sb.append(" "); return sb.toString(); }
为String的数组列表
list.forEach(s -> System.out.println(Arrays.toString((String[]) s )));
List<String> textList= messageList.stream() .map(Message::getText) .collect(Collectors.toList()); textList.stream().forEach(System.out::println); public class Message { String name; String text; public Message(String name, String text) { this.name = name; this.text = text; } public String getName() { return name; } public String getText() { return text; } }
public static void main(String[] args) { answer(10,60); } public static void answer(int m,int k){ AtomicInteger n = new AtomicInteger(m); Stream<Integer> stream = Stream.generate(() -> n.incrementAndGet()).limit(k); System.out.println(Arrays.toString(stream.toArray())); }
根据是否需要独立列出值,可以使用以下2个选项:
System.out.println(listName.get(i).toString());
输出:
71
839
1471
6857
或者如果你不关心结果是否单独列出,你可以使用
System.out.println(listName.toString());
输出:[71,839,1471,6857]
看到这个在行动,这是我正在捣鼓的代码…
public static void main(String[] args) { final long Original = 600851475143L; long numberToEval=0; long remains = 1; List<Integer> factors = new ArrayList<Integer>(); numberToEval = Original; while((remains < Original) && (remains != 0)) { remains = breakDown(numberToEval); if(remains > 0){ factors.add((int) remains); numberToEval = numberToEval / remains; } } remains = numberToEval; factors.add((int) remains); for(int i = 0; i < factors.size(); i++) { System.out.println(factors.toString()); } } static long breakDown (long numPass) { long myNum = numPass; long startPoint = (myNum / 2); for(long x = 2; x < startPoint; x++) { if(myNum % x == 0) { numPass = x; x = startPoint+1; System.out.println(numPass); } } if(myNum == numPass) { return 0; } else { return numPass; } }
尝试重写toString()方法,因为您希望该元素将被打印。 所以打印的方法可以是这样的:
for(int i=0;i<list.size();i++){ System.out.println(list.get(i).toString()); }