2015-02-22 5 views
1

Я пытаюсь объединить два массива объектов типа «BookCollection» в один массив BookCollection. Я начинаю с создания нового пустого BookCollection с размером, эквивалентным сумме двух других BookCollections.Слияние двух массивов объектов, Java

код работает с первым "collection1":

public static BookCollection merge(BookCollection collection1, BookCollection collection2) { 
BookCollection mergedCollection = new BookCollection(collection1.getSize() + collection2.getSize()); 
int collectionSize = 0; 
// Add books from collection1 to mergedCollection. 
// This loop works, 2/21/15, 3:30 
for (int c1 = 0; c1 < collection1.getSize(); c1++) { 
    Book bookCopy = new Book(collection1.objectAt(c1)); 
    mergedCollection.addBook(bookCopy); 
    collectionSize += 1; 
}    

Теперь я бегу в неприятности. Мое намерение состоит в том, чтобы пропустить следующий BookCollection (collection2), и если книга существует, просто обновите цену и запас. Если этого не существует, я хочу добавить книгу в BookCollection.

// Loop through collection2 
for (int c2 = 0; c2 < collection2.getSize(); c2++) { 
    // Create a copy of the current book. 
    Book bookCopy = new Book(collection2.objectAt(c2)); 
    String copyIsbn = bookCopy.getIsbn(); 
    // Loop through mergedCollection 
    for (int m = 0; m < mergedCollection.getSize(); m++) { 

    Book mergedBook = new Book(mergedCollection.objectAt(m)); 
    String mergedIsbn = mergedBook.getIsbn(); 

    // If the current book is already in mergedCollection. 
    // NOT GETTING THROUGH THE LOGIC HERE. 
    if (copyIsbn.equals(mergedIsbn)) { 
     // Variables to update values in mergedCollections 
     double price = bookCopy.getPrice(); 
     int stock = bookCopy.getStock(); 
     // If the mergedBook's price is larger than the collection's, change it. 
     if (mergedBook.getPrice() > price) { 
     mergedBook.setPrice(price); 
     } 
     // Update stock in mergedCollection 
     mergedCollection.changeStock(mergedBook.getIsbn(), bookCopy.getStock() + mergedBook.getStock());  

    // If the current book is not in mergedCollection.  
    } else { 
     mergedCollection.addBook(bookCopy);   
     collectionSize += 1; 
    }   

    } 
} 
return mergedCollection; 

}

Я попытался прокомментировать это хорошо, и есть комментарий заглавных букв, где я считаю, что проблема есть. Теперь я думаю, что это уместно знать, что addBook(), используемый здесь:

mergedCollection.addBook(bookCopy); 

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

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

if (copyIsbn.equals(mergedIsbn)) 

не работает, как я хочу, чтобы это.

Почему моя программа не улавливает объекты книги, которые происходят дважды и обновляют информацию?

+1

Потому что вы хотите [Установить] (http: //java.sun.com/javase/6/docs/api/java/util/Set.html), в частности [TreeSet] (http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html) 'addAll. – hd1

+0

Мне не нужен набор, поскольку я хотел бы узнать, почему этот метод не работает. Спасибо, что ознакомили меня с этой идеей, и я попытаюсь реализовать ее с этим, когда выясню, почему мой подход не работает. – camerow

+0

* «не работает, как я хочу» * Это не полезное описание проблемы. Что происходит? – Radiodef

ответ

1

Я бы предложил вместо этого использовать Set. Позвольте мне показать вам пример:

Давайте предположим, что ваш класс книги что-то вроде:

class Book 
{ 
    private String bookNo; 
    private int price; 
    private int stock; 

    public Book(String bookNo, int price, int stock) { 
     this.bookNo = bookNo; 
     this.price = price; 
     this.stock = stock; 
    } 

    public String getBookNo() { 
     return bookNo; 
    } 
    public int getPrice() { 
     return price; 
    } 
    public int getStock() { 
     return stock; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj != null && obj instanceof Book) { 
      if(this.bookNo.equals(((Book) obj).bookNo)) { 
       return true; 
      } 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return this.bookNo.hashCode(); 
    } 
} 

Теперь для того чтобы достигнуть того, что вы хотите, вы можете сделать что-то вроде:

Set<Book> hs1 = new HashSet<Book>(); 
    Set<Book> hs2 = new HashSet<Book>(); 

    hs1.add(new Book("book1", 10, 10)); 
    hs1.add(new Book("book2", 20, 20)); 

    hs2.add(new Book("book3", 30, 30)); 
    hs2.add(new Book("book1", 40, 40)); 

    hs2.addAll(hs1); 

hs2 есть желаемые данные.

+0

Please см. мой комментарий '+ 1'd – hd1

+0

Да, я полностью согласен с вами. – Kartic

+0

Это отличный ответ, спасибо. Как я уже писал ранее, я выяснил способ заставить мой метод работать, но это намного более элегантно и удивительно. Будем использовать это в будущем точно. – camerow

0

Если ваша цель состоит в том, чтобы обновить объект, вместо создания нового экземпляра:

Book mergedBook = new Book(mergedCollection.objectAt(m)); 

использовать существующий экземпляр уже в коллекции:

Book mergedBook = mergedCollection.objectAt(m); 

Тогда любые изменения, сделанные в mergedBook будет быть постоянным для объекта, который находится в объединенном собрании.

0

Хорошо, я понял это. Я всегда работаю:

mergedCollection.addBook(bookCopy); 

Все, что я должен был сделать создать:

found = false; 

переменных и вложат свою функцию .addBook в этом.

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