[英]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.