繁体   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