2015-06-04 5 views
3

У меня есть класс, называемый CD со следующими частными переменными:Динамическое создание нового экземпляра в Java

private String artist = ""; 
private String year = ""; 
private String albumName = ""; 
private ArrayList<String> songs = new ArrayList<String>(); 

Этот класс используется для хранения входных данных, которые в этом формате:

Led Zeppelin 
1979 In Through the Outdoor 
-In the Evening 
-South Bound Saurez 
-Fool in the Rain 
-Hot Dog 
-Carouselambra 
-All My Love 
-I'm Gonna Crawl 

У меня есть класс CDParser, который отвечает за разбор файла с именем sample.db по строкам, чтобы сохранить его в нашем объекте CD. После разбора, в CD объекте, после его инициализации с CD newCD = new CD() имеет следующую структуру:

artist = "Led Zeppelin" 

year = "1979" 

albumName = "In Through the Outdoor" 

songs = {"-In the Evening", "-South Bound Saurez", "-Fool in the Rain", "-Hot Dog"} 

сейчас .. Для этого проекта, sample.db содержит много альбомов, которые выглядят следующим образом:

Led Zeppelin 
1979 In Through the Outdoor 
-In the Evening 
-South Bound Saurez 
-Fool in the Rain 
-Hot Dog 
-Carouselambra 
-All My Love 
-I'm Gonna Crawl 

Led Zeppelin 
1969 II 
-Whole Lotta Love 
-What Is and What Should Never Be 
-The Lemon Song 
-Thank You 
-Heartbreaker 
-Living Loving Maid (She's Just a Woman) 
-Ramble On 
-Moby Dick 
-Bring It on Home 

Bob Dylan 
1966 Blonde on Blonde 
-Rainy Day Women #12 & 35 
-Pledging My Time 
-Visions of Johanna 
-One of Us Must Know (Sooner or Later) 
-I Want You 
-Stuck Inside of Mobile with the Memphis Blues Again 
-Leopard-Skin Pill-Box Hat 
-Just Like a Woman 
-Most Likely You Go Your Way (And I'll Go Mine) 
-Temporary Like Achilles 
-Absolutely Sweet Marie 
-4th Time Around 
-Obviously 5 Believers 
-Sad Eyed Lady of the Lowlands 

I до сих пор смогли разобрать все три разных альбома и сохранить их в моем объекте CD, но столкнулись с блокпостом, где я просто сохраняю все три альбома в одном и том же объекте newCD.

Мой вопрос - есть ли способ программно инициализировать мой CD конструктор, который будет соответствовать формату newCD1, newCD2, newCD3 и т.д., как я разобрать sample.db?

Что это означает, как я разобрать этот конкретный файл:

  1. newCD1 будет альбомом In Through the Outdoor (и его соответствующие частные вары)

  2. newCD2 будет альбомом II (и его соответствующие частные вары)

  3. newCD3 будет альбом Blonde on Blonde и т. д.

Это умный способ сделать это? Или вы могли бы предложить мне лучший способ?

EDIT:

Прикрепленный мой анализатор кода. ourDB является ArrayList, содержащий каждую линию sample.db:

CD newCD = new CD(); 

    int line = 0; 

    for(String string : this.ourDB) { 
     if(line == ARTIST) { 
      newCD.setArtist(string); 
      System.out.println(string); 
      line++; 
     } else if(line == YEAR_AND_ALBUM_NAME){ 
      String[] elements = string.split(" "); 

      String[] albumNameArr = Arrays.copyOfRange(elements, 1, elements.length); 

      String year = elements[0]; 
      String albumName = join(albumNameArr, " "); 

      newCD.setYear(year); 
      newCD.setAlbumName(albumName); 

      System.out.println(year); 
      System.out.println(albumName); 

      line++; 
     } else if(line >= SONGS && !string.equals("")) { 
      newCD.setSong(string); 
      System.out.println(string); 
      line++; 
     } else if(string.isEmpty()){ 
      line = 0; 
     } 
    } 
+0

Непонятно, что вы пытаетесь сделать. также, если возможно, добавить текущий фрагмент кода – Pranalee

+0

Кажется, что вы не правильно зацикливаетесь между объектами. Покажите нам больше кода, который у вас есть. – elias

+0

Вы ищете массивы и списки? – biziclop

ответ

7

У вас есть объект CD, поэтому вы его переписываете. Вместо этого вы можете взять коллекцию CD s. Например:

List<CD> cds = new ArrayList<>(); 

CD newCD = new CD(); 
int line = 0; 

for(String string : this.ourDB) { 
    if(line == ARTIST) { 
     newCD.setArtist(string); 
     System.out.println(string); 
     line++; 
    } else if(line == YEAR_AND_ALBUM_NAME){ 
     String[] elements = string.split(" "); 

     String[] albumNameArr = Arrays.copyOfRange(elements, 1, elements.length); 

     String year = elements[0]; 
     String albumName = join(albumNameArr, " "); 

     newCD.setYear(year); 
     newCD.setAlbumName(albumName); 

     System.out.println(year); 
     System.out.println(albumName); 

     line++; 
    } else if(line >= SONGS && !string.equals("")) { 
     newCD.setSong(string); 
     System.out.println(string); 
     line++; 
    } else if(string.isEmpty()){ 
     // We're starting a new CD! 
     // Add the one we have so far to the list, and start afresh 
     cds.add(newCD); 
     newCD = new CD(); 
     line = 0; 
    } 
} 

// Take care of the case the file doesn't end with a newline: 
if (line != 0) { 
    cds.add(newCD); 
} 
+0

Да! Это то, что я имею в виду! – theGreenCabbage

+0

Ah .. Мой источник путаницы пришел из того факта, что я думал, что каждый экземпляр, который я храню в моей коллекции, должен иметь другое имя, то есть, если у меня есть 'newCD' в моем списке' newCD 's, следующий экземпляр должен не содержат одно и то же имя. – theGreenCabbage

+0

Привет, Mureinik. С этим я столкнулся с проблемой, когда я печатаю только первые два альбома - третий альбом, кажется, отсутствует. Я продолжил добавлять утверждения печати в каждый оператор if перед окончательным else-if, и я получал правильные выходы, но если я попробую свой объект 'CD' в' 'if-statement' string.isEmpty(), то я только получить два объекта CD. – theGreenCabbage

5

Проблема заключается в том, что вы используете один и тот же ссылку на объект из CD заполнить значения разборе файла.

Просто убедитесь, что вы инициализируете и храните каждый экземпляр CD newCD каждый раз, когда вы начинаете разборе содержимого нового альбома.

Вы можете сделать следующее:

List<CD> cdList = new ArrayList<>(); 
for (<some way to handle you're reading a new album entry from your file>) { 
    CD cd = new CD(); 
    //method below parses the data in the db per album entry 
    //an album entry may contain several lines 
    parseData(cd, this.ourDB); 
    cdList.add(cd); 
} 
System.out.println(cdList); 

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

List<CD> cdList = new ArrayList<>(); 
Iterator<String> yourDBIterator = this.ourDB.iterator(); 
//it will force to enter the first time 
while (yourDBIterator.hasNext()) { 
    //do the parsing here... 
    CD cd = new CD(); 
    //method below parses the data in the db per album entry 
    //an album entry may contain several lines 
    parseData(cd, yourDBIterator); 
    cdList.add(cd); 
} 

//... 
public void parseData(CD cd, Iterator<String> it) { 
    String string = it.next(); 
    int line = ARTIST; 
    while (!"".equals(string)) { 
     if (line == ARTIST) { 
      newCD.setArtist(string); 
      System.out.println(string); 
      line++; 
     } else if(line == YEAR_AND_ALBUM_NAME){ 
      String[] elements = string.split(" "); 
      String[] albumNameArr = Arrays.copyOfRange(elements, 1, elements.length); 
      String year = elements[0]; 
      String albumName = join(albumNameArr, " "); 
      newCD.setYear(year); 
      newCD.setAlbumName(albumName); 
      System.out.println(year); 
      System.out.println(albumName); 
      line++; 
     } else if(line >= SONGS && !string.equals("")) { 
      newCD.setSong(string); 
      System.out.println(string); 
      line++; 
     } 
     if (it.hasNext()) { 
      string = it.next(); 
     } else { 
      string = ""; 
     } 
    } 
} 

Затем код

+0

. Я действительно использую тот же экземпляр класса 'CD'. Каков мой вопрос - как мне динамически генерировать новый экземпляр для хранения каждого альбома? – theGreenCabbage

+1

@ TheGreenCabbage только сделайте 'CD новыйCD = новый CD();' правильно. –

+0

Спасибо - это именно то, что я имел в виду – theGreenCabbage

0

Я предлагаю использовать шаблон проектирования Builder для создания объекта CD. Если вы читаете строки всегда в одном порядке, это будет не сложно реализовать и использовать. Хороший учебник: http://www.javacodegeeks.com/2013/01/the-builder-pattern-in-practice.html

Смежные вопросы