2013-09-01 31 views
0

我有一個LinkedList,它的元素是書。書籍有自己的價格,一本書可以反覆添加到列表中(無需訂購),每次添加時,價格可能會有所不同。現在,我必須在列表中找到最暢銷的圖書,將相同圖書的所有不同價格相加,並將其除以列表中的出現次數。對於發現同一本書的所有事件,我都遇到了麻煩,因爲它們是無序的。如何找到Java LinkedList中的平均值?

任何人都可以提供一些關於此的想法。

謝謝。

回答

1

有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

1

只需通過列表並將書籍添加到Map<String, int>,您可以使用它來跟蹤圖書銷售的次數。

檢查Map<String, int>以查看該書是否已經存在,如果沒有,則添加它。如果該書已經在Map<String, int>中,則增加整數。

+0

但每次將圖書添加到其圖書清單時,價格都會有所不同,這意味着圖書是根據客戶和具體情況出售的。在我將它除以地圖列表中增加的整數之前,如何合計總價? – dhssa

1

因爲我不能評論,所以我添加到以前的答案。最簡單的方法:只需使用另一張地圖即可。 所以,你有2個地圖: 地圖 地圖

迭代原來的鏈表,數量和使用兩個地圖添加價格。

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獲得平均值。