Вопрос по java, list – Как распечатать все элементы списка в Java?

187

Я пытаюсь распечатать все элементыListоднако он печатает указательObject а не значение.

Это мой печатный код ...

for(int i=0;i<list.size();i++){
    System.out.println(list.get(i));
} 

Может ли кто-нибудь помочь мне, почему он не печатает значение элементов.

Вы должны вызвать toString, и вы получите объяснение класса или переопределить метод toString для типа, который содержится в списке L7ColWinters
ArrayList & л; класс & GT; list = new ArrayList & lt; class & gt; (); user1335361
Какой тип вы объявилиList быть? Покажите нам, как вы объявили и создали его экземпляр. Makoto
Это то, что вы говорите печатать - вам нужна другая строка toString или другая читаемая строка. Dave Newton
Обратите внимание, что существует более компактный синтаксис, который можно использовать для достижения той же цели:for (Object obj : list) {System.out.println(obj);}. aroth

Ваш Ответ

20   ответов
1

    list.stream().map(x -> x.getName()).forEach(System.out::println);
Какой тип имеетx и как это связано с вопросом ФП?
-1

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()));
    }
Как этот код связан с вопросом?
8

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)
How are these approaches different from each other?

First Approach (Iterable.forEach)- Итератор коллекции обычно используется и предназначен дляотказоустойчивость быстро что означает, что это броситConcurrentModificationException если основная коллекцияstructurally modified во время итерации. Как уже упоминалось вдоктор заArrayList:

A structural modification is any operation that adds or deletes one or more elements, or explicitly resizes the backing array; merely setting the value of an element is not a structural modification.

Так значит дляArrayList.forEach установка значения допускается без каких-либо проблем. И в случае одновременного сбора, напримерConcurrentLinkedQueue итератор будетслабо согласуется что означает действия, переданные вforEach разрешено вносить даже структурные изменения безConcurrentModificationExceptionисключение выбрасывается. Но здесь изменения могут или не могут быть видны в этой итерации.

Second Approach (Stream.forEach)- Порядок не определен. Хотя это может не произойти для последовательных потоков, но спецификация не гарантирует этого. Также действие должно быть не мешающим по своей природе. Как уже упоминалось вдоктор:

The behavior of this operation is explicitly nondeterministic. For parallel stream pipelines, this operation does not guarantee to respect the encounter order of the stream, as doing so would sacrifice the benefit of parallelism.

Third Approach (Stream.forEachOrdered)- Действие будет выполнено в порядке встречи потока. Поэтому всякий раз, когда порядок имеет значение, используйтеforEachOrdered без второй мысли. Как уже упоминалось вдоктор:

Performs an action for each element of this stream, in the encounter order of the stream if the stream has a defined encounter order.

Итерируя поsynchronized collection first approach будет один раз брать блокировку коллекции и удерживать ее во всех методах вызовов к действию, но в случае потоков они используют сплитератор коллекции, который не блокирует и использует уже установленные правила невмешательства. В случае, если поддержка коллекции изменяется во время итерацииConcurrentModificationException будет брошен или может произойти противоречивый результат.

Fourth Approach (Parallel Stream.forEach)- Как уже упоминалось, нет гарантии соблюдения порядка встречи, как ожидается в случае параллельных потоков. Возможно, что действие выполняется в разных потоках для разных элементов, что никогда не может быть в случае сforEachOrdered.

Fifth Approach (Parallel Stream.forEachOrdered)- forEachOrdered будет обрабатывать элементы в порядке, указанном источником, независимо от того, является ли поток последовательным или параллельным. Поэтому нет смысла использовать это с параллельными потоками.

99

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;
    }
}
Как происходит введениеModel класс связан с вопросом?
Это всего лишь предположение, поскольку я не знаю, какой объект находится внутри списка.
0

Цикл For для печати содержимого списка:

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
8

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

    }

}
features.forEach(System.out::println);Error: User Rate Limit Exceeded()Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededfeaturesError: User Rate Limit Exceeded()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

так как вы хотите, чтобы элемент был printend. поэтому метод печати может быть таким:

for(int i=0;i<list.size();i++){
    System.out.println(list.get(i).toString());
} 
Error: User Rate Limit ExceededtoStringError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
28

System.out.println(list);//toString() is easy and good enough for debugging.

toString() изAbstractCollection  будет чисто и достаточно легко сделать это. AbstractList это подклассAbstractCollection, so no need to for loop and no toArray() needed.

Returns a string representation of this collection. The string representation consists of a list of the collection's elements in the order they are returned by its iterator, enclosed in square brackets ("[]"). Adjacent elements are separated by the characters ", " (comma and space). Elements are converted to strings as by String.valueOf(Object).

Если вы используете какой-либо пользовательский объект в вашем списке, скажем «Студент», вам нужно переопределить его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]
Error: User Rate Limit Exceededlist: List -> Collection -> Iterable -> ObjectError: User Rate Limit ExceededArrayListError: User Rate Limit ExceededtoString()Error: User Rate Limit ExceededArrayListError: User Rate Limit ExceededAbstractCollectionError: User Rate Limit ExceededArrayList: ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object
Error: User Rate Limit Exceeded
14

Объекты в списке должны иметь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 = [email protected]
t2 = 5

Поскольку T1 не переопределяет метод toString, его экземпляр t1 печатается как нечто, что не очень полезно. С другой стороны, T2 переопределяет toString, поэтому мы контролируем, что он печатает, когда он используется в I / O, и мы видим что-то немного лучше на экране.

0

list.forEach(s -> System.out.println(Arrays.toString((String[]) s )));
5

You haven't specified what kind of elements the list contains, if it is a primitive data type then you can print out the elements.

ed to implement (override) the method "toString" within that object - if it is not already implemented - and let it return something meaning full from within the object, example:

class Person {
    private String firstName;
    private String lastName;

    @Override
    public String toString() {
        return this.firstName + " " + this.lastName;
    }
}
-2

   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;
     }
   }
Что этот код будет делать? пожалуйста, дополните.
18

Подход Java 8 Streams ...

list.stream().forEach(System.out::println);
тот же ответ, что и у Кати Хан
Нет, это не так. Шахта усиливает поток ().
@BradleyD какая выгода достигается добавлением еще одного слоя вызовов методов?
381

Следующее компактно и позволяет избежать цикла в вашем примере кода (и дает вам хорошие запятые):

System.out.println(Arrays.toString(list.toArray()));

Однако, как отмечали другие, если у вас нет разумных методов toString (), реализованных для объектов внутри списка, вы получите указатели объектов (фактически, хеш-коды), которые вы наблюдаете. Это верно, находятся ли они в списке или нет.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededtoStringError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededlist.toString().
85

Начиная с Java 8, List наследует по умолчанию & quot; forEach & quot; метод, который можно объединить со ссылкой на метод & quot; System.out :: println & quot; как это:

list.forEach(System.out::println);
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededprintlnError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

List<Integer> leaveDatesList = new ArrayList<>();

.....inserted value in list.......

Way 1: printing a list in a for loop

for(int i=0;i<leaveDatesList.size();i++){
    System.out.println(leaveDatesList.get(i));
}

Way 2: printing the list in a forEach, for loop

for(Integer leave : leaveDatesList){
    System.out.println(leave);
}

Way 3: printing the list in java 8

leaveDatesList.forEach(System.out::println);
1

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

Или вы можете просто использовать утилиты Apache Commons:

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils.html#toString-java.lang.Object-

List<MyObject> myObjects = ...
System.out.println(ArrayUtils.toString(myObjects));
1

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].

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

Я написал функцию дампа, которая в основном печатает открытые члены объекта, если он не переопределяет toString (). Можно легко расширить это, чтобы вызвать добытчиков. Javadoc:

Dumps an given Object to System.out, using the following rules:

  • If the Object is Iterable, all of its components are dumped.
  • If the Object or one of its superclasses overrides toString(), the "toString" is dumped
  • Else the method is called recursively for all public members of the 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();
}

Похожие вопросы