我有一个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
中获取平均值。
您使用 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 来定价等。
只需浏览列表并将书籍添加到一个Map<String, int>
中,您可以使用该列表来跟踪一本书的销售次数。
检查Map<String, int>
以查看该书是否已存在,如果没有,请添加它。如果书已经在Map<String, int>
则递增 int。
无法发表评论,所以我添加到以前的答案中。最简单的方法:只需使用另一张地图即可。所以你有 2 张地图: 地图 地图
迭代原始链接列表,使用两个地图计算和添加价格。