2015-01-02 2 views
0

Я хочу определить наиболее продаваемый продукт в векторе экземпляра Stock.Является ли моя логика, чтобы определить наиболее продаваемый товар правильно?

public void mostSold(Vector <Stock> temp){ 
    System.out.println ("Generating Data... Please Wait!"); 
    delay(650); 
    System.out.println ("-------Most Sold Product(s)-------"); 
    for(int i = 0; i < temp.size(); i ++){ 
     s = temp.elementAt(i); // Stock s = new Stock(); 
     sold1 = s.getSold(); 
     sold2 = msold.getSold(); //Stock msold = new Stock(); 
     if(sold1 > sold2) 
      msold = s; 
     else if (sold2 > sold1) 
      msold = msold; 
     else if (sold1 == sold2){ 
      equal = true; 
     } 
    } 
    if(!equal) 
     System.out.println (msold.toSold()); 
    else{ 
     System.out.println (msold.toSold()); 
     System.out.println (s.toSold()); 
    } 
    System.out.println(); 
} 

В первом, когда она выполняется это работает отлично, но если я выполняю его 2 раза в одном исполнении, консоль выводит как mostSold и leastSold ...!

OUTPUT !! первого запуск: (работает отлично)

Generating Data... Please Wait! 
-------Most Sold Product(s)------- 
Product Name: iphone 
Product ID: 0123P 
Quantity Sold: 10 

Generating Data... Please Wait! 
-------Least Sold Product(s)------- 
Product Name: nexus 
Product ID: 2345P 
Quantity Sold: 1 

второго Пробег:

Generating Data... Please Wait! 
-------Most Sold Product(s)------- 
Product Name: iphone 
Product ID: 0123P 
Quantity Sold: 10 
Product Name: htc one //WHY IS THIS DISPLAYED!! 
Product ID: 3456P 
Quantity Sold: 1 

Generating Data... Please Wait! 
-------Least Sold Product(s)------- 
Product Name: nexus 
Product ID: 2345P 
Quantity Sold: 1 
+0

Вы можете включить класс Stock? –

+0

@ ᴘᴀɴᴀʏɪᴏᴛɪs Если вы так хотите, но есть много кода ... –

+0

@ ᴘᴀɴᴀʏɪᴏᴛɪs На самом деле я вполне уверен, что именно из этого метода 'mostSold()', потому что другой метод, который я здесь не включил, 'minimumSold()' работает отлично, и он был скопирован и вставлен в код. –

ответ

1

Вы можете иметь две акции с одинаковым значением.

Предположим, у вас есть акции, как 1,1,2

Так у вас есть по умолчанию запас с 0 значением, по сравнению с 1 (первого запаса) в то время как цикл:

sold1 > sold2 satisfies and with this default becomes 1st stock with value 1 

цикл выглядит для следующего запас, который опять-таки стоимости 1

sold1 == sold2 satisfies and equal becomes true 

для цикла выглядит для следующего запаса, снова значения 2

sold2 > sold1 satisfies msold remains unchanged 

Теперь посмотрим, что равно верно, так что вы войти еще часть и распечатать его дважды с утверждением как:

System.out.println (msold.toSold()); 
System.out.println (s.toSold()); 

Вы можете просто напечатать все, что максимальное скорее, чем печать старое значение, а также.

+0

'System.out.println (msold.toSold()); System.out.println (s.toSold()); ' То, что я пытался достичь, состояло в том, чтобы напечатать все продукты, которые были наиболее проданы ... так как у них одинаковое количество проданного количества. –

+0

Может быть много акций с равным количеством продаж. Поэтому, когда вы видите два одинаково проданных объекта, попробуйте сохранить список и добавить их в него. Поэтому, когда вы видите несколько равных акций, вы можете просто распечатать их. – SMA

0

Я предлагаю следующий простой код, который работает в два этапа:

  1. Он определяет максимальное значение для sold.
  2. Он собирает все предметы запаса, которые имеют это значение.
  3. Он возвращает все эти позиции, вместо того, чтобы печатать их.

Вот код:

public List<Stock> getMostSold(Iterable<Stock> stocks) { 
    int maxSold = Integer.MIN_VALUE; 
    for (Stock stock : stocks) { 
    maxSold = Math.max(maxSold, stock.getSold()); 
    } 

    List<Stock> result = new ArrayList<>(); 
    for (Stock stock : stocks) { 
    if (stock.getSold() == maxSold) { 
     result.add(stock); 
    } 
    } 
    return result; 
} 

Важным является то, что этот метод не имеет побочных эффектов, то есть, он не изменяет поля класса или других вещей. Поэтому вы можете называть его так часто, как хотите, и вы всегда получите тот же результат.

+0

Я вижу, что это использование списка. Это то же самое, что и вектор? Извините, если это глупо, я новичок в java. –

+0

«Список» - это не то же самое, что «Вектор», но они очень похожи. «Вектор» старый и ржавый, а «Лист» - более современный. Основное отличие состоит в том, что «Вектор» может использоваться несколькими потоками одновременно (об этом вы узнаете позже). Но в большинстве случаев это необязательно, и поэтому достаточно простого «ArrayList» или «List». –

+0

Чтобы угодить вашему учителю, вы можете заменить 'List',' ArrayList' и 'Iterable' в приведенном выше коде символом' Vector'. –

0

Вы можете использовать Comparator:

private static final Comparator<Stock> COMPARATOR 
    = new Comparator<Stock>() 
    { 
     @Override 
     public int compare(final Stock o1, final Stock o2) 
     { 
      return Integer.compare(o1.getSold(), o2.getSold()); 
     } 
    }; 

// and then (NOTE: assumes at least one element, and no null elements) 
public Stock mostSold(final List<Stock> list) 
{ 
    final int size = list.size(); 
    Stock ret = list.get(0); 

    for (int i = 1; i < size; i++) 
     if (COMPARATOR.compare(list.get(i), ret) > 0) 
      ret = list.get(i); 

    return ret; 
} 

Если вы используете Java 8 это еще проще:

public Stock mostSold(final List<Stock> list) 
{ 
    return list.stream().max(COMPARATOR).get(); 
} 
Смежные вопросы