2013-06-26 36 views
0

我正在構建一些應該創建輸入字符串緩存的方法,將它們加載到列表中,然後確定該列表中每個字符串的出現次數,按照最常見的元素排列它們。將字符串加載到緩存中的最佳方法

字符串或元素本身來自JUnit測試。它調用了一個名爲

lookupDistance(dest) 

方法,其中「目標」是一個字符串(目的地機場代碼),以及lookupDistance返回兩個機場代碼之間的距離....

有背景。問題是我想將所有「dest」字符串加載到緩存中。什麼是最好的方式來做到這一點?

我有骨架代碼已調用的方法:

public List<String> mostCommonDestinations() 
  1. 我將如何增加「目標」字符串列表以透明的方式? JUnit測試用例只調用lookupDistance(dest),那麼如何將這些「dest」字符串重定向到此方法中的List?

  2. 然後,我將如何量化每個元素出現的次數,並說,排名前三或四?

回答

0

您可以在啓動時添加已知目標,並在到達時不斷添加新字符串緩存。這是一種方式。另一種方式是根據請求緩存字符串,並保留它們以備將來使用。在這種情況下,你的lookupDistance也應該緩存字符串。

首先製作一個包含Hashmap的小類。關鍵是你的目標字符串,如果你想保存多個信息或者只是一個數字來指定該字符串被使用了多少次,該值可以是一個對象。我會建議使用數據對象。 請注意,下面的代碼只是給你一個想法,更像是一個僞代碼。

class Cache { 
private Hashmap<String, CacheObject>; 

public void Add(string, CacheObject); 
public CacheObject Lookup(string); 
public CacheObject Remove(string); 
public static Cache getInstance(); //single cache 
} 

class CacheObject { 
public int lookupCount; 
public int lastUsed; 
} 

在你lookupDistance你可以簡單地做

if(Cache.getInstance().Lookup(string) == null) { 
Cache.getInstance().Add(string, new CacheObject() { 1, Date.now}); 
} 
0
  1. 有一個Map<String, Integer> destinations = new HashMap<>();

  2. lookupDistance(dest),這樣做(未經測試的僞代碼):

    整數計數= destinations.get(dest); (count == null){ destinations.put(dest,Integer.valueOf(1)); (count.intValue()+ 1); count = Integer.valueOf(count.intValue()+ 1);其他{0}。 }

這樣,你算每個dest的出現次數。

  1. 瀏覽地圖並找到最高的數量。這有點棘手。一種方法可能是:

    列表> list = new ArrayList <>(); list.addAll(destinations.entrySet()); //現在你有一個「條目」列表,其中每個映射從dest到其各自的計數器 //該列表現在必須被排序 Collections.sort(list,comparator);

我們在這個調用中使用的比較器還有待寫入。它必須有兩個參數,它們是列表的元素,並根據它們的計數器值進行比較。其餘的例程將由sort例程完成。

Comparator<Map.Entry<String, Integer>> comparator = new Comparator<>() { 
    public @Override int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) { 
     return a.getValue().intValue() - b.getValue().intValue(); 
    } 
} 

好了,我們有EntryList一個現在排序,從中可以挑選前5名左右。認爲這是非常多的。所有這些看起來比它應該更復雜,所以我對其他解決方案很好奇。

+0

嗯,我沒有得到正確的代碼格式。也許有更多的語法知識的人可以編輯它並使其正確。此外,列表中的第三點應編號爲「3.」,而不是「1」。 –

相關問題