2013-09-01 2 views
0

У меня есть LinkedList, а его элементы - книги. Книги имеют свои цены, и книга может быть добавлена ​​в список повторно (не заказана), и каждый раз, когда они добавляются, их цены могут отличаться. Теперь я должен найти самую продаваемую книгу в списке, добавив все разные цены той же книги и разделив ее на количество вхождений в списке. У меня возникают проблемы с нахождением всей записи той же книги, в которой они не упорядочены.Как найти среднее значение в Java LinkedList?

может кто-нибудь дать некоторые идеи об этом.

спасибо.

ответ

1

Есть 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 рекомендуется по ценам и тому подобное.

1

Просто просмотрите список и добавьте книги в Map<String, int>, которые вы можете использовать для отслеживания того, сколько раз продается книга.

Проверьте Map<String, int>, чтобы узнать, есть ли в нем книга, если нет, добавьте ее. Если книга уже находится в Map<String, int>, то увеличивайте int.

+0

но каждый раз, когда книга добавляется в ее книжный список, цена будет отличаться, что означает, что книга продается на основе клиента и конкретной ситуации. Как добавить общую цену до того, как я разделил ее на инкрементированный int в списке карт? – dhssa

1

Потому что я не могу комментировать, поэтому я добавляю к предыдущему ответу. Самый простой способ: просто используйте другую карту для общего. Так у вас есть 2 карты: Карта Карта

Iterate оригинальный LinkedList, граф и добавить цену, используя две карты.

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.

Смежные вопросы