Почему мой ArrayList печатает первый объект 3 раза?

Я относительно новичок в Java. Я выполнял упражнение, в котором мы исследуем полиморфное поведение экземпляров подклассов и суперклассов. Это упражнение основано на концепциях абстрактных классов и интерфейсов. В этом упражнении представлены списки массивов. Один из вопросов требует, чтобы мы создали ArrayList объектов WrittenWork, называемых продуктами, и добавили соответствующие объекты в ArrayList.

Моя проблема в том, что ArrayList продолжает печатать первый элемент 3 раза, а затем печатает остальные элементы.

Может ли кто-нибудь объяснить, почему это продолжается?

Обновлено: Я понял ошибку, которую я совершал, благодаря вам, ребята! Я изменил цикл for с

   for(WrittenWork w: products)
       System.out.println(w1.toString());
       System.out.println(w2.toString());
       System.out.println(w3.toString());

К

for(WrittenWork w: products)
    System.out.println(w.toString());

Это изображение показывает, как все классы связаны

Вот код:

import java.util.*;

public class BookStore
{
  public static void main(String[] args)
  {
   Author a1 = new Author("Malcom Gladwell");
   Author a2 = new Author("Steven Johnson");
   Author a3 = new Author("Mathias Johansson");
   Author a4 = new Author("Evan Ackerman");
   Author a5 = new Author("Erico Guizzo");
   Author a6 = new Author("Fan Shi");

   WrittenWork w1 = new Novel(a1, "What the Dog Saw and other adventures", 503);
   WrittenWork w2 = new Novel(a2, "How We Got to Now: Six Innovations That Made the Modern World", 320);
   WrittenWork w3 = new Novel(a2, "Everything Bad Is Good For you: How Today's Popular Culture is Actually Making us Smarter", 254);


   ArrayList<WrittenWork>products = new ArrayList<>();
   products.add(w1);
   products.add(w2);
   products.add(w3);

   for(WrittenWork w: products)
       System.out.println(w1.toString());
       System.out.println(w2.toString());
       System.out.println(w3.toString());

   }
 }

это результат

В вашем цикле нет скобок, поэтому выполняется только первый оператор. Почему вы вообще используете цикл, если вы жестко кодируете операторы печати?

GBlodgett 16.03.2019 17:16

Почему вы не печатаете w?

florgeng 16.03.2019 17:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
277
6

Ответы 6

for (WrittenWork w: products){
   System.out.println(w.toString()); 
}

Так должно быть:

  for(WrittenWork w: products)
       System.out.println(w.toString());

  }

Вы уже просматриваете все объекты WrittenWork, использование w1, w2, w3 сводит на нет использование цикла for в первую очередь.

Попробуй это:

for (WrittenWork w: products){
   System.out.println(w.toString()); 
}

Вы повторяете ArrayList, но печатаете w1, w2 и w3 на каждой итерации. Как указывали другие, печатайте w в каждой итерации, которая указывает на элемент, соответствующий итерации.

for (WrittenWork w: products){
   System.out.println(w.toString()); 
}

Помимо того, что вы не использовали скобки для правильной идентификации блока for, у вас есть логический недостаток в вашем небольшом фрагменте кода.

Вы написали

the ArrayList keeps printing the first item 3 times and then prints the rest of the items

Это навело меня на мысль, что ваш код на самом деле не отражает того, чего вы на самом деле хотите достичь.
Поначалу это совершенно нормально, не волнуйтесь. Кажется, вы хотите распечатать все WrittenWork.

Для этого вы использовали цикл (повышенная) for

for (WrittenWork w : products)

но вы никогда не учитывали локальную переменную w.

В фоновом режиме для вас создается Iterator<WrittenWork> (JavaDoc), и на каждой итерации элемент следующий в списке products передается вам через w.

Вам просто нужно использовать эту переменную w, чтобы напечатать все элементы products.
Iterator исчерпает себя, и цикл остановится.


Насколько вам известно, этот стиль for-loop

for (WrittenWork w : products) { ... }

эквивалентно

for (Iterator<WrittenWork> iterator = products.iterator(); iterator.hasNext(); ) {
    final WrittenWork w = iterator.next();
    ...
}

Вы можете видеть отмеченное условие iterator.hasNext();.

for(WrittenWork w: products)
       System.out.println(w1.toString());
       System.out.println(w2.toString());
       System.out.println(w3.toString());

   }

В режиме выполнения программы это может заставить вас чувствовать себя хорошо, и она работает, но возникает логическая проблема: если вы выберете печать всех объектов с помощью отдельных методов System.out.println, то почему вы использовали for(each)-loop?

Кроме того, вам не нужно вызывать метод toString() неявно и автоматически, если в метод System.out.println передается ссылка на объект

Другие вопросы по теме