我有一個LinkedList,它的元素是書。書籍有自己的價格,一本書可以反覆添加到列表中(無需訂購),每次添加時,價格可能會有所不同。現在,我必須在列表中找到最暢銷的圖書,將相同圖書的所有不同價格相加,並將其除以列表中的出現次數。對於發現同一本書的所有事件,我都遇到了麻煩,因爲它們是無序的。如何找到Java LinkedList中的平均值?
任何人都可以提供一些關於此的想法。
謝謝。
我有一個LinkedList,它的元素是書。書籍有自己的價格,一本書可以反覆添加到列表中(無需訂購),每次添加時,價格可能會有所不同。現在,我必須在列表中找到最暢銷的圖書,將相同圖書的所有不同價格相加,並將其除以列表中的出現次數。對於發現同一本書的所有事件,我都遇到了麻煩,因爲它們是無序的。如何找到Java LinkedList中的平均值?
任何人都可以提供一些關於此的想法。
謝謝。
有aany您使用的是LinkedList的具體理由,如果不是地圖可以讓你的生活變得更加簡單:
Map<String, List<Book>> bookShelf = new HashMap<String, List<Book>>();
void addBook(Book book) {
String key = book.name + book.author; // For illustration
List<Book> bookList = null;
if (!bookShelf.containsKey(key)) {
bookList = new ArrayList<Book>();
bookShelf.put(key, bookList);
} else {
bookList = bookShelf.get(key);
}
bookList.add(book);
}
double fetchAverage(Book input){
String key = ""/*key logic*/;
List<Book> booklist = bookShelf.get(key);
double avg = 0.0;
for(Book b: booklist){
avg += b.price;
}
return avg/booklist.size();
}
OR
的情況下,鏈表的:
LinkedList<Book> bookList = new LinkedList<Book>();
double avg = 0.0;
int counter = 0;
for (Book b : bookList) {
if (b.equals(inputBook)) { // must override hashCode() and equals in
// Book and it should be independent of
// price
avg += b.price;
counter++;
}
}
return avg/counter;
您可以通過保持列表排序來增強它,以便連續出現具有相同名稱和作者的所有書籍。
OR 維護的情況下,你不希望重寫一個temporaryList等於:
LinkedList<Book> temporaryBookList = new LinkedList<Book>();
for (Book b : bookList) {
if (b.name.equals(inputBook.name) && b.author.equals(inputBook.author)) {
temporaryBookList.add(b);
}
}
double avg = 0.0;
for(Book b : temporaryBookList){
avg += b.price;
}
return avg/temporaryBookList.size();
注:價格雙僅用於說明。對於價格等,鼓勵使用BigDecimal。
只需通過列表並將書籍添加到Map<String, int>
,您可以使用它來跟蹤圖書銷售的次數。
檢查Map<String, int>
以查看該書是否已經存在,如果沒有,則添加它。如果該書已經在Map<String, int>
中,則增加整數。
因爲我不能評論,所以我添加到以前的答案。最簡單的方法:只需使用另一張地圖即可。 所以,你有2個地圖: 地圖 地圖
迭代原來的鏈表,數量和使用兩個地圖添加價格。
小助手類來跟蹤總價和出現次數的將是無價:
public class AverageCounter {
private int occurrences;
private BigDecimal totalPrice;
public BigDecimal currentAverage() {
return totalPrice.divide(BigDecimal.valueOf(occurrences));
}
public void addOccurringPrice(BigDecimal price) {
occurrences++;
totalPrice = totalPrice.add(price);
}
}
然後循環的LinkedList
並將條目添加到Map<Book, AverageCounter>
。
最後只是從映射的AverageCounter
s獲得平均值。
但每次將圖書添加到其圖書清單時,價格都會有所不同,這意味着圖書是根據客戶和具體情況出售的。在我將它除以地圖列表中增加的整數之前,如何合計總價? – dhssa