簡體   English   中英

我確定最暢銷產品的邏輯正確嗎?

[英]Is my logic to determine the most sold product correct?

我想確定實例庫存向量中最暢銷的產品。

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 ();
}

剛開始執行時,它工作正常,但是如果我一次執行兩次,控制台將同時輸出mostSold和MinimumSold ...!

輸出! 第一次運行:(效果不錯)

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

您可能有兩只同等價值的股票。

假設您的股票有1,1,2

因此,您擁有默認值為0的默認庫存,並與while循環中的1(第一批庫存)進行比較:

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

for循環尋找下一個價值又為1的股票

sold1 == sold2 satisfies and equal becomes true

for循環尋找下一個價值2的下一個股票

sold2 > sold1 satisfies msold remains unchanged

現在看到equal是正確的,因此您輸入else部分並用如下語句將其打印兩次:

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

您可能只打印最大值,而不是打印舊值。

我建議使用以下簡單的代碼,該代碼可在兩個階段中工作:

  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;
}

重要的是,此方法沒有副作用,也就是說,它不會修改類的任何字段或其他內容。 因此,您可以根據需要多次調用它,並且始終可以得到相同的結果。

您可以使用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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM