Почему мой ArrayList печатает первый объект 3 раза? - PullRequest
0 голосов
/ 16 марта 2019

Я относительно новичок в Java. Я выполнял упражнение, в котором мы исследуем полиморфное поведение экземпляров подкласса и суперкласса. Это упражнение основано на понятиях абстрактных классов и интерфейсов. ArrayLists представлены в этом упражнении. Один из вопросов требует от нас создания 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());

   }
 }

Это вывод

Ответы [ 6 ]

2 голосов
/ 16 марта 2019

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

Вы написали

, который хранит ArrayListпечать первого элемента 3 раза, а затем печать остальных элементов

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

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

for (WrittenWork w : products)

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

В фоновом режиме происходит то, что для вас создается Iterator<WrittenWork> ( JavaDoc ), а на каждой итерации next *Элемент 1027 * в списке products предоставляется вам через w.

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


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

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

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

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

Youможно увидеть проверенное состояние iterator.hasNext();.

1 голос
/ 16 марта 2019
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 метод

0 голосов
/ 16 марта 2019

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

for (WrittenWork w: products){
   System.out.println(w.toString()); 
}
0 голосов
/ 16 марта 2019

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

for (WrittenWork w: products){
   System.out.println(w.toString()); 
}
0 голосов
/ 16 марта 2019

Должно быть:

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

  }

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

0 голосов
/ 16 марта 2019
for (WrittenWork w: products){
   System.out.println(w.toString()); 
}
...