Есть aany конкретных причин вы используете 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;
Возможно, вы можете улучшить его, сохранив сортировку списка, чтобы все книги с одинаковым именем и автором происходили последовательно.
ИЛИ Поддерживать 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 рекомендуется по ценам и тому подобное.
но каждый раз, когда книга добавляется в ее книжный список, цена будет отличаться, что означает, что книга продается на основе клиента и конкретной ситуации. Как добавить общую цену до того, как я разделил ее на инкрементированный int в списке карт? – dhssa