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

时间:2013-09-01 07:11:21

标签: java linked-list

我有一个LinkedList,它的元素是书籍。书籍有自己的价格,书籍可以反复添加到列表中(未订购),每次添加时,价格可能会有所不同。现在我必须通过将同一本书的所有不同价格相加并将其除以列表中的出现次数来找到列表中最畅销的书籍。我找不到同一本书的所有相关内容,因为它们是无序的。

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

谢谢。

4 个答案:

答案 0 :(得分: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获得平均值。

答案 1 :(得分:1)

只需浏览列表并将图书添加到Map<String, int>即可用于跟踪图书销售的次数。

检查Map<String, int>以查看图书是否已存在,如果没有,请添加。如果该书已经在Map<String, int>中,那么增加int。

答案 2 :(得分:1)

因为我无法评论所以我添加到之前的答案。最简单的方法:只使用另一张地图。 所以你有2张地图:     地图     图

使用两张地图迭代原始的链表,计算并添加价格。

答案 3 :(得分:1)

您使用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;

您可以通过保持列表排序来增强它,因此所有具有相同名称和作者的书籍会连续出现。

如果您不想覆盖equals:

,请维护一个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等价格。