2015-08-31 28 views
2

得到了一些有趣的邏輯,我試圖用最有效和可讀的方式進行編碼。我將展示下面的scneario(模擬/虛擬環境)爲給定場景定義更高效的邏輯

我有一個銀行和他們的出納員評論(1-5 int字段)的數據存儲。一個出納員可以有一個客戶選擇贏家(CCW)字段。我的要求如下,最多可選擇5位出納員爲特定銀行顯示給用戶:

  1. 如果出納員是CCW,請選擇它。如果多個出納員有CCW,請使用出納員評論打破關係
  2. 如果沒有CCW,請選擇評分最高的評分員。

我必須爲5家銀行做上述事情。我得到的邏輯是有一個for循環來遍歷5個銀行,並在每個循環內,爲每個銀行遍歷所有出納員5次(以選出5個出納員)。這對我來說似乎是非常低效和不明確的。這裏是我的意思:

foreach (Bank b : banks) { 
    List<Tellers> tellers = b.getTellers(); 

    foreach (Teller t : tellers) { 
     List<Reviews> reviews = t.getReviews(); 

     ...// get 4 reviews following the above logic. 
    } 
} 

任何人都可以幫助我用更清晰,更有效的方式來寫這個嗎?

謝謝!

+0

你使用Java 8? –

+0

有什麼理由不能通過數據庫來完成(SQL或其他)? –

+0

出納員是否包含所有銀行的所有出納員?或者特別是每個透視銀行的出納員? – DrewB

回答

1

這樣做的最好的解決辦法是對列表進行排序<特勒>

您必須通過實現Comparable接口定義teller對象比較功能。

這將讓你運行在固定時間內你的算法(O(25),因爲5票員的5家銀行,這實在是O(1))

在分揀它的第一次的成本,這將是O(nlogn)

示例代碼爲您的取款類:

public class Teller implements Comparable 
{ 

    private boolean ccw = false; 
    private int rating; 

    public boolean hasCCW() { return ccw; } 
    public int getRating() { return rating; } 

    //... your code 

    @Override 
    public int compareTo(Object o) 
    { 
     Teller that = (Teller)o; 
     //if this has ccw and that doesn't, this < that 
     if(this.hasCCW() && !that.hasCCW()) 
     { 
      return -1; 
     } 
     //else if this does not have ccw, and that does, this > that 
     else if(!this.hasCCW() && that.hasCCW()) 
     { 
      return 1; 
     } 
     //else they both have ccw, so compare ratings 
     else 
     { 
      return Integer.compare(this.getRating(), that.getRating()); 
     } 
    } 

} 

然後,你的算法將只需要搶第5個計票每家銀行。

例如:

//Sort the tellers: 
//ideally, call this only once, and insert future Tellers in order (to maintain ordering) 
for(Bank bank : banks) 
{ 
    for(List<Teller> tellers : bank.getTellers()) 
    { 
     Collections.sort(tellers); 
    } 
} 

//then, to get your top tellers: 
for(Bank bank : banks) 
{ 
    Teller bestTeller = bank.getTeller(0); 
    Teller secondBestTeller = bank.getTeller(1); 
    //... 
} 
+0

如果我唯一要做的是出納員評論,那就行了。但是每個出納員都有一個額外的CCW領域,必須進行檢查。所以說,我有40個出納員,其中5個是CCW,算法應該返回那5個。如果有3個CCW,算法應該返回那3個,其他2個基於誰最有4個星評論。如果出納員有6個CCW,則使用檢查計數將6個CCW中排名前5的出納員退回。這仍然適用於這些場景嗎? –

+0

我覺得我需要一個清晰的方法將這個邏輯代碼化,然後將其優化爲第二步。在進入運行時分析之前有任何幫助嗎? –

+0

是的。您可以在比較功能中定義您剛剛說的所有內容。如果兩個櫃員對象都有CCW,則檢查他們的評分。在定義方法之後,您將可以簡單地調用Collections.sort(出納員),並且它將在內部處理排序。 –