2017-03-17 66 views
1

我需要你幫助的人,因爲我堅持這個。確定「結果最好的爆炸」項目結果

我怎樣才能從下面的結果中識別和打印每個類別只有1(一)「最佳爆炸記錄」記錄?考慮到單位價格,運營成本和投資回收期。

這是否有一個通用公式?

我有一段Java代碼,通過一些計算從數據庫獲取一些數據,並生成以下結果。

ABProduct abproduct = null; 
ArrayList result_new = new ArrayList(); 
result_new.addAll(ProductDao.getProdutcs(customer, country)); 

if(result_new!=null){ 
for(int i=0; i<result_new.size(); i++) { 
    abproduct = (ABProduct) result_new.get(i); 
    aID = abproduct.getID(); 
    aName = abproduct.getName(); 
    aPrice = abproduct.getPrice(); 
    aCategory = abproduct.getCategory(); 

    //The below variable are calculated on fly 
    aCost = ... 
    aPaybackTime = ... 

    //Here I print the results 
    } 
} 

結果是這樣的:

ID Name  Unit Price Category Operating Cost Payback Time 

11 AA1CC0 88.41  3   146.5   4.6 
9 AA22VB 64.99  3   146.94   1.9 
10 AA3BN5 79.69  3   147.51   4.1 
18 AA47VV 88.08  3   147.63   5.3 
17 AA5HJ2 79.32  3   149.55   5.6 
16 AA61YA 75.24  3   150.16   5.4 

21 AA9Y0A 104.99  5   140.74   3.9 
33 AA10DA 182.03  5   140.74   9.4 
40 AA11K1 119.99  5   140.82   5 
32 AA121D 154.99  5   141.25   7.7 
27 AA13S1 159.89  5   141.8   8.5 
38 AA1433 102.05  5   141.93   4 
41 AA15D0 139.99  5   141.97   7 
31 AA166D 109.89  5   142.07   4.7 
36 AA17D3 149.99  5   142.07   7.9 
30 AA187H 99.99  5   142.17   4 
35 AA19G5 129.99  5   142.17   6.3 
22 AA20P4 119.99  5   142.39   5.6 
39 AA21K8 109.95  5   142.52   4.9 
20 AA228I 88.84  5   142.81   3.2 
29 AA239O 92.47  5   142.96   3.6 
24 AA241C 102.5  5   143    4.4 
19 AA259L 73.99  5   143.08   2 
23 AA260K 79.99  5   143.13   2.6 
26 AA277B 84.99  5   143.35   3.1 
34 AA28YI 305.99  5   144.51   24.9 

42 AA31Y0 189.99  6   139.47   9.1 
45 AA32Y9 138.14  6   139.54   5.8 
44 AA33R7 129.99  6   140    5.4 
46 AA34R4 203.11  6   140.25   10.5 
43 AA35A3 99.99  6   140.37   3.5 
47 AA36A4 229.99  6   140.38   12.5 
48 AA37Q5 341.99  6   140.57   20.5 

50 AA40DF 199.99  7   136.44   8.2 
52 AA41CC 402.95  7   136.88   19.7 
51 AA42VG 279.99  7   137.73   13.5 
49 AA43EW 195.33  7   137.97   8.6 

我需要什麼要的(我不知道如果我從5類鑑定權項):

ID Name  Unit Price Category Operating Cost Payback Time 

9 AA22VB 64.99  3   146.94   1.9 
20 AA228I 88.84  5   142.81   3.2 
43 AA35A3 99.99  6   140.37   3.5 
50 AA40DF 199.99  7   136.44   8.2 
+2

目前還不完全清楚你在「我需要它」的表中使用什麼標準。這代表什麼?而且,「爆炸」是什麼意思?你怎麼定義它?什麼是運營成本?每次都是一些平價還是某種成本?什麼是回報時間?你需要在這裏想出一些指標,你需要澄清一下你的條款。 –

+0

你想按「付款時間」排序嗎?你沒有顯示你的*邏輯*做這件事,但我認爲你可以改變你的SQL來做這個排序。 –

+0

^是的,我的意思是,如果你想按回報時間排序,你可以在SQL中進行計算(假設它看起來你使用的是ORM,通常有這樣做的方法,你可以實現它,例如'ProductDao .getProductsSortedByPaybackTime')。如果你想避免在SQL和別處的業務邏輯中實現重複的數學運算,你可以在你的數據庫中創建一個視圖,添加該列並將其作爲字段添加到實體類中。但是,這仍然非常複雜,使用自定義比較器簡單地調用'Collections.sort()'數組也很簡單。 –

回答

2

所以這裏有幾個選項。最直接的選擇,這也適用於你使用數據庫的而不是的情況,只是將所有內容按類別分開,然後進行排序。一個地圖是有道理的,這一點,如:

  • 仔細檢查每個產品,並放入地圖的→類產品(如Map<Integer,List<Product>>或如Multimap from Guava or whatever - 一個ArrayListMultimap將特別適合,因爲它返回方便地修改值List s,您可以直接排序;另一種替代方法是TreeMultimap,它允許您在創建時指定值比較器,並且產品將自然最終排序)。
  • 查看該地圖中的每個類別,對該類別中的產品列表(請參閱Collections.sort和自定義比較器)進行排序,從每個列表中拉出第一個項目,這就是您的結果。

你得有使計算的投資回報時間值可用來比較,對你有幾種選擇的方式:

  • 只是做每比較回收期計算比較。
  • 更好的選擇:將getPaybackTime()方法添加到ABProduct,只需在那裏進行計算。這樣你的計算就在一個合理的地方,你可以隨時隨地訪問它們,例如在排序產品列表時在比較器中。

Here's a quick and dirty example

第二種選擇是使用任何O [RM /數據庫API的查詢構建功能,以便在SQL查詢中完成所有操作。我不會在這裏詳細討論,因爲「如何選擇組的最小值」是一個很常見的問題,有各種技術(例如參見SQL: Group by minimum value in one field while selecting distinct rows)。

爲您做這件事的方法是在SQL查詢本身中執行「回報時間」計算數學,並指定您使用任何ORM /數據庫API提供的任何查詢(您不用「T指定,並超出了這個問題的答案)的範圍,並指出你可以做這樣的事情與SQL(由數學):

SELECT 
    *, 
    UnitPrice - OperatingCost AS Whatever 
FROM 
    Products 

這裏的缺點是,現在你已經得到了你的數學在你的SQL查詢何時可以說是一個業務功能而不是數據訪問功能。如果你的數據庫支持它(MySQL, for example),並且可能在你的實體類中添加計算列作爲一個字段,爲了使這至少在某種程度上可以管理,你可能希望至少用這個數學算法創建一個視圖。

第二個基於SQL的選項可能會有點難以實現,所以我只是採用第一種業務端方法(按類別分類產品,排序,彙總結果)開始。從哲學的角度來說,無論如何它都是非常合適的:這個這是一個商業級的操作,它在商業方面做得更乾淨一些。

這個答案不完全完整,但我希望它有幫助。


順便說一句,對於第一種選擇(組織然後進行排序),你可能真的想要做的就是添加一個「類別」實體數據層,以及,假設你有一個類別表,建立適當的一對多分類與產品關係。

然後你可以有一個dao方法來獲得所有的類別。這樣,您可以查詢類別列表,然後遍歷每個類別並直接獲取該類別中的產品並進行排序(在業務方面)。在您的產品實體中制定getPaybackTime()方法來進行計算也會對您有所幫助。

如果你這樣做,你可以跳過分類到分類的步驟,因爲你現在可以直接通過數據層進行分類。這也會有一些性能和內存使用的好處。

這是我選擇親自實施它的方式。

+0

可否請你給我一個想法,當試圖把這一行放入它時,multiMap是怎麼樣的? '20 AA228I 88.84 5 142.81 3.2' –

+0

@MyroslavTedoski我不知道我理解你的問題。一個'Multimap '是合適的,例如'map.put(product.getCategory(),product)'爲每個產品。然後'map.get(category)'將返回該類別中所有產品的「Collection 」,您可以根據自己心中的願望進行分類。 'map.keySet()'會返回所有類別ID的'Set '。 –

+0

@MyroslavTedoski我已經更新了關於'ArrayListMultimap'和'TreeMultimap'的註釋和一些示例代碼。 –