어떻게 목록의 자바에 있는 모든 요소들을 인쇄할?
.List
그러나 그것은의 포인터를 인쇄하고 있습니다.Object
오히려 값보다.
이것은 나의 인쇄 코드...
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
왜 그것이 요소의 값 인쇄하지 않은 사람은 도와 주시겠습니까.
그 다음과 같은 당신의 코드 예제에서는(그리고 당신이 좋은 쉼표를 준다)의 루프를 피한다:수 있다.
System.out.println(Arrays.toString(list.toArray()));
만약 너는 toString()방법은 목록 안에 있는 개체에 구현되지 않아도 다른 이들이라고 지적했다 그러나 포인터 당신을 관찰했을 때(해시 코드를 사실)개체를 가져올 것이다.이 그들이 목록이나에 존재하지 않죠 사실이다.
여기 몇가지 예는 목록 성분을 출력 받는 것에 대해: 있다.
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;
}
}
자바 8이후로, 간단히 메서드를 참조"시스템과 조합할 수 있는 기본"forEach"메서드를 상속합니다.을:이:println":
list.forEach(System.out::println);
System.out.println(list);//toString() is easy and good enough for debugging.
ToString()AbstractCollection고 그것을 하기 위해 충분히 쉽게 깨끗하게 해야 한다. AbstractList
는 「」의 서브 입니다.AbstractCollection
에게 루프에 대한 필요도 없고 toArray()필요하다.
반환합니다 이 컬렉션의 문자열 표현입니다.문자열 표현은 반복자가 반환하는 순서대로 대괄호("[]")로 둘러싸인 컬렉션 요소 목록으로 구성됩니다.인접 요소는 문자 ", " (콤마와 공백)로 구분됩니다.요소는 String.valueOf(Object)와 마찬가지로 문자열로 변환됩니다.
(Student하고 있는 는, 그 커스텀오브젝트(Student)를 .toString()
method는 의미 입니다.
다음의 예를 참조해 주세요.
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]
String.join()
예를 들어 다음과 같습니다.
System.out.print(String.join("\n", list));
Java 8 Streams 접근법...
list.stream().forEach(System.out::println);
록음음음음음음음음음음음음음이 있어야 .toString
의미 있는 내용을 인쇄하기 위해 구현되었습니다.
다음은 차이점을 확인하기 위한 간단한 테스트입니다.
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로 사용할 때에 인쇄하는 것을 제어해, 화면에 조금 더 좋은 것이 표시됩니다.
또는 Apache Commons 유틸리티를 사용할 수도 있습니다.
List<MyObject> myObjects = ...
System.out.println(ArrayUtils.toString(myObjects));
「」를 생각해 .List<String> stringList
Java 8 구조를 사용하여 다양한 방법으로 인쇄할 수 있습니다.
stringList.forEach(System.out::println); // 1) Iterable.forEach
stringList.stream().forEach(System.out::println); // 2) Stream.forEach (order maintained generally but doc does not guarantee)
stringList.stream().forEachOrdered(System.out::println); // 3) Stream.forEachOrdered (order maintained always)
stringList.parallelStream().forEach(System.out::println); // 4) Parallel version of Stream.forEach (order not maintained)
stringList.parallelStream().forEachOrdered(System.out::println); // 5) Parallel version ofStream.forEachOrdered (order maintained always)
이러한 접근 방식은 서로 어떻게 다릅니까?
첫 번째 접근법()-Iterable.forEach
컬렉션의 반복기는 일반적으로 사용되며, 이는 실패 속도가 빠르도록 설계되어 있습니다. 즉, 이 경우 수집이 느려집니다.ConcurrentModificationException
기본 컬렉션이 반복 중에 구조적으로 변경된 경우.문서에 기재되어 있는 바와 같이ArrayList
:
구조 수정이란 요소를 하나 이상 추가 또는 삭제하거나 백업 배열 크기를 명시적으로 조정하는 작업입니다. 요소의 값을 설정하는 것만으로는 구조 수정이 아닙니다.
①에 ,ArrayList.forEach
값 설정은 문제없이 허용됩니다.그그 、 집집 、 ,,예를를,, 、ConcurrentLinkedQueue
반복기는 약하게 일관성이 없기 때문에 전달되는 액션을 의미합니다.forEach
한 구조 ConcurrentModificationException
예외가 느려지고 있습니다.그러나 여기서 수정 내용은 해당 반복에서 보일 수도 있고 표시되지 않을 수도 있습니다.
두 번째 접근()-Stream.forEach
순서가 정의되지 않았습니다.순차 스트림에서는 발생하지 않을 수 있지만 사양상 보장되지 않습니다.또한 본질적으로 간섭이 없어야 합니다.문서에 기재된 바와 같이:
이 조작의 동작은 명시적으로 확정적이지 않습니다.병렬 스트림 파이프라인의 경우, 이 작업은 스트림의 조우 순서를 존중하는 것을 보장하지 않습니다. 그렇게 하면 병렬 처리의 이점이 희생되기 때문입니다.
세 번째 접근법()-Stream.forEachOrdered
작업은 스트림의 접촉 순서로 수행됩니다.그래서 순서 문제가 있을 때마다forEachOrdered
아무 생각 없이문서에 기재된 바와 같이:
스트림에 만남 순서가 정의된 경우 스트림의 만남 순서로 이 스트림의 각 요소에 대해 액션을 수행합니다.
동기화된 수집을 반복하는 동안 첫 번째 접근법은 수집의 잠금을 한 번 취하고 모든 Calls to Action 메서드에 걸쳐 유지하지만 스트림의 경우 잠기지 않고 이미 확립된 비간섭 규칙에 의존하는 수집의 스플리터를 사용합니다.스트림을 지원하는 컬렉션이 반복 중에 수정된 경우ConcurrentModificationException
던지거나 일치하지 않는 결과가 발생할 수 있습니다.
네 번째 접근법(Parallel) - 이미 언급한 바와 같이 병렬 스트림의 경우 예상대로 조우 순서를 준수한다는 보장은 없습니다.다른 요소에 대해 다른 스레드에서 액션이 수행될 수 있습니다.이러한 액션은 다른 요소에서는 결코 발생할 수 없습니다.forEachOrdered
.
다섯 번째 접근법 (병렬)- TheforEachOrdered
는 스트림이 순차인지 병렬인지에 관계없이 소스에 의해 지정된 순서대로 요소를 처리합니다.따라서 병렬 스트림과 함께 사용하는 것은 의미가 없습니다.
나도 비슷한 문제에 직면했다.내 코드:
List<Integer> leaveDatesList = new ArrayList<>();
.....inserted value in list.......
방법 1: for 루프에서 목록 인쇄
for(int i=0;i<leaveDatesList.size();i++){
System.out.println(leaveDatesList.get(i));
}
방법 2: 목록을 각각 for, for 루프로 인쇄합니다.
for(Integer leave : leaveDatesList){
System.out.println(leave);
}
방법 3: Java 8에서 목록 인쇄
leaveDatesList.forEach(System.out::println);
- 목록에 포함된 요소의 종류를 지정하지 않았습니다. 기본 데이터 유형인 경우 요소를 인쇄할 수 있습니다.
단, 요소가 오브젝트인 경우 Kshitij Mehta가 언급한 바와 같이 메서드 "toString"을 오브젝트 내에서 구현(덮어쓰기)해야 합니다(아직 구현되지 않은 경우).또, 오브젝트내에서 풀의 의미를 가지는 것을 반환할 필요가 있습니다.예:
class Person { private String firstName; private String lastName; @Override public String toString() { return this.firstName + " " + this.lastName; } }
String 배열 목록
list.forEach(s -> System.out.println(Arrays.toString((String[]) s )));
목록 내용을 인쇄하는 루프의 경우:
List<String> myList = new ArrayList<String>();
myList.add("AA");
myList.add("BB");
for ( String elem : myList ) {
System.out.println("Element : "+elem);
}
결과:
Element : AA
Element : BB
한 줄로 인쇄하는 경우(참고용으로만):
String strList = String.join(", ", myList);
System.out.println("Elements : "+strList);
결과:
Elements : AA, BB
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
구현 여부 및 구현되어 있는지 여부toString()
방법. System.out.println(list)
는 모든 표준 Java 오브젝트 타입을 인쇄해야 합니다(String
,Long
,Integer
기타) 커스텀 오브젝트 타입을 사용하는 경우override
toString()
커스텀 오브젝트의 메서드.
예제:
class Employee {
private String name;
private long id;
@Override
public String toString() {
return "name: " + this.name() +
", id: " + this.id();
}
}
테스트:
class TestPrintList {
public static void main(String[] args) {
Employee employee1 =new Employee("test1", 123);
Employee employee2 =new Employee("test2", 453);
List<Employee> employees = new ArrayList(2);
employee.add(employee1);
employee.add(employee2);
System.out.println(employees);
}
}
list.stream().map(x -> x.getName()).forEach(System.out::println);
오브젝트가 string()으로 덮어쓰지 않은 경우 기본적으로 오브젝트의 퍼블릭멤버를 출력하는 덤프함수를 썼습니다.콜게터(call getters)자바독:
지정된 개체를 시스템에 덤프합니다.다음 규칙을 사용하여 out을 실행합니다.
- 오브젝트가 Itable인 경우 오브젝트의 모든 컴포넌트가 덤프됩니다.
- 오브젝트 또는 그 슈퍼클래스 중 하나가 toString()에 덮어쓰면 "toString"이 덤프됩니다.
- 그렇지 않으면 오브젝트의 모든 공개 멤버에 대해 메서드가 재귀적으로 호출됩니다.
/**
* 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();
}
마침 지금 이 일을 하고 있는데...
List<Integer> a = Arrays.asList(1, 2, 3);
List<Integer> b = Arrays.asList(3, 4);
List<int[]> pairs = a.stream()
.flatMap(x -> b.stream().map(y -> new int[]{x, y}))
.collect(Collectors.toList());
Consumer<int[]> pretty = xs -> System.out.printf("\n(%d,%d)", xs[0], xs[1]);
pairs.forEach(pretty);
Java 11의 문제 해결 방법은 다음과 같습니다.
String separator = ", ";
String toPrint = list.stream().map(o -> String.valueOf(o)).collect(Collectors.joining(separator));
System.out.println(toPrint);
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()));
}
요소가 printend가 되도록 toString() 메서드를 덮어씁니다.인쇄 방법은 다음과 같습니다.
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).toString());
}
다음 작업을 수행할 수 있습니다.
2D(또는 그 이상)용
System.out.println(Arrays.deepToString(list.toArray()));
1D용
System.out.println(Arrays.toString(list.toArray())
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;
}
}
언급URL : https://stackoverflow.com/questions/10168066/how-to-print-out-all-the-elements-of-a-list-in-java
'programing' 카테고리의 다른 글
구조체 배열 끝에 빈 중괄호 '{ }'가 필요한 이유는 무엇입니까? (0) | 2022.09.01 |
---|---|
vuejs의 Axios에서 계산된 속성을 자동으로 새로 고치는 방법 (0) | 2022.09.01 |
기본적으로 5가 아닌 웹 팩 4를 사용하는 Vue CLI (0) | 2022.09.01 |
vuex / nuxtClientInit용 후크가 생성되었습니까? (0) | 2022.09.01 |
C에서 어레이 선언 및 초기화 (0) | 2022.09.01 |