0

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

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

谢谢你。

4

4 回答 4

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 中获取平均值。

于 2013-09-01T07:36:38.743 回答
1

只需浏览列表并将书籍添加到Map<String, int>您可以用来跟踪一本书售出多少次的书籍。

检查Map<String, int>该书是否已经存在,如果没有,请添加它。如果这本书已经在里面,Map<String, int>那么增加 int。

于 2013-09-01T07:14:57.910 回答
1

因为我不能评论所以我添加到以前的答案。最简单的方法:只需使用另一张地图即可。所以你有 2 个地图: Map Map

使用两个映射迭代原始链表、计数和添加价格。

于 2013-09-01T07:27:36.823 回答
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<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 。

于 2013-09-01T07:53:14.083 回答