簡體   English   中英

合並兩個對象數組,Java

[英]Merging two object arrays, Java

我正在嘗試將兩個類型為“ BookCollection”的對象數組合並到一個BookCollection數組中。 我首先制作一個新的空白BookCollection,其大小等於其他兩個BookCollection的總和。

該代碼與第一個“ 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);

基本上說,如果我解析數組,並獲得非null的返回值,那么我可以添加這本書。

現在,當我運行這段代碼時,編譯器告訴我我要添加的書存在並且停止。 所以我知道a)addBook找到一個非空值,b)這一點邏輯:

if (copyIsbn.equals(mergedIsbn))

不能按我希望的那樣工作。

為什么我的程序沒有捕獲兩次出現的Book對象並更新信息?

我建議改用Set。 讓我給你看一個例子:

假設您的Book類類似於:

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具有所需的所需數據。

如果您的目標是更新對象,而不是創建新實例:

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

使用集合中已經存在的現有實例:

 Book mergedBook = mergedCollection.objectAt(m);

然后,對mergedBook所做的任何更新將持久化到mergedCollection中的對象。

好吧,我明白了。 我一直在跑步:

mergedCollection.addBook(bookCopy);

我要做的就是創建一個:

found = false;

變量並將我的.addBook函數嵌入其中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM