簡體   English   中英

如何在Java LinkedList中找到平均值?

[英]how do I find the average in a Java LinkedList?

我有一個LinkedList,它的元素是書。 書籍有其價格,一本書可以重復(無序)添加到列表中,並且每次添加時,它們的價格可能會有所不同。 現在,我必須通過將同一本書的所有不同價格相加並將其除以列表中的出現次數,來在列表中找到最暢銷的書。 我很難找到同一本書的所有出現,因為它們是無序的。

任何人都可以對此提出一些想法。

謝謝。

一個小班幫手跟蹤總價和出現次數將被證明是無價的:

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獲取平均值即可。

只需瀏覽列表,然后將書籍添加到Map<String, int> ,即可用於跟蹤書籍的銷售次數。

檢查Map<String, int>以查看該書是否已經存在,如果沒有,請添加它。 如果書籍已經在Map<String, int>然后增加int。

因為我無法發表評論,所以我添加了以前的答案。 最簡單的方法:只需使用另一個地圖即可。 因此,您有2張地圖:Map Map

迭代原始鏈表,使用兩張地圖進行計數並增加價格。

您是否有使用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();
}

要么

如果是LinkedList:

    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;

您可以通過對列表進行排序來增強它的功能,以便所有具有相同名稱和作者的書都連續出現。

維護一個臨時列表,以防您不想覆蓋等於:

    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作為價格之類的價格。

暫無
暫無

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

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