2017-04-20 27 views
1

我有一個HashMap它有Object作爲值。我想找不到。在HashMap值中有Object的所有這些值在屬性中具有一些定義的值。防爆。提到如下:有效的方法來查找對象的一些屬性值的發生沒有作爲哈希值的值

class Employee{ 
    private String name; 

    public String getName(){ 
    return name; 
    } 

    public void setName(String name){ 
    this.name = name; 
    } 
} 
Map<Integer, Employee> emp = new HashMap<Integer, Employee>(); 

emp.add(1, E1); 
emp.add(2, E2); 

我想找到hashmap中出現的位置number =「robert」。 什麼是最有效的方式來做到這一點。我可以做到沒有循環,因爲我的hasmapmap非常大。

回答

0

我不認爲是可能的,除非你創建了一種順序。例如,如果您將鍵名按升序排列,並且值按字典順​​序排列,則可以使用輔助搜索算法將名稱按複雜度O(log2(n))排序。

其他的解決辦法是dinamically保存於其他結構的這種信息來獲得更迅速,像一個哈希地圖,鍵名,和值出現

希望這有助於

2

接聽無循環部分,不是那麼多最有效的方式部分:您可以使用Java 8 Streams不使用循環來實現它,但這並不會使它本身更有效。

從理論上講,如果Map非常大,並行化可能會有所幫助。雖然在這種情況下,它不太可能,因爲filter Predicate在計算上非常便宜。

無論如何,使用Java 8 Streams很容易實現並行化。 假設你的Employee類有getName()方法,你可以嘗試這樣的事情

Map<Integer, Employee> emp = new HashMap<Integer, Employee>(); 

String name = "robert"; 

long count = emp.values() 
     .parallelStream() 
     .filter(e -> name.equals(e.getName())) 
     .count(); 

編輯

看來我是有點太相對於由於平行流潛在的運行時改進悲觀。我用一個包含750_000條目的HashMap測量了一個四核I7的小型測試。

for循環方法的改進始終約爲50%。那就是如果(並且只有在!)你一遍又一遍地平均來說,你可以將你的處理速度提高一倍。

0

一個簡單的方法,你可以嘗試(但不是最好的)

String name = "robert"; 
int count = 0; 
for(Employee theEmployee: emp.values()) { 
    if (theEmployee.getName().equals(name)) { 
     count++; 
    } 
} 

編輯:我注意到在你的代碼的東西 - >添加到HashMap中這樣

emp.put(1, E1); 
emp.put(2, E2); 
emp.put(3, E3); 

emp.add(1, E1); 
emp.add(2, E2); 
emp.add(3, E3); 
+0

添加僅供參考。不用於實際的代碼。但在上面提出的答案中,for循環仍在進行。我如何避免循環,因爲我的Hashmap非常大? – Ashutosh

相關問題