2015-10-28 75 views
1

行,我有在Java相關的最大價值如何找到鑰匙

Set<String> s; 
HashMap<String, Double> hm; 

而且,我想找到hm密鑰,其所有可能的密鑰(候選人)S IN中涉及到的最大值集合s。

下面的方法是我已經有,這有助於我找到關於一個值的多個鍵。我可能會使用Collections.Max(hm.values())得到最大的價值

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) { 
    Set<T> keys = new HashSet<T>(); 
    for (Entry<T, E> entry : map.entrySet()) { 
     if (Objects.equals(value, entry.getValue())) { 
      keys.add(entry.getKey()); 
     } 
    } 
    return keys; 
} 

會是什麼「整潔」的解決方案,你可以建議?

過去幾個月我一直在使用Python,現在處理所有類型的地圖而不是Java的字典是非常不方便的。


我想談談對這個問題是什麼,在Java中有些「聰明」的方式簡化了下面的代碼。

import com.google.common.collect.Sets; 

double maxVal = 0.0; 

for(String candidate : s){ 
    if(hm.get(candidate) >= maxVal){ 
     maxVal = hm.get(candidate); 
    } 
} 
Set<String> subset = Sets.intersection(set, getKeysByValue(hm, maxVal)); 

可能的類Python實現(名單理解)是

subset = set.intersection(s, getKeysByValue(hm, Collections.max([hm.get(item) for item in s])) 
+0

檢查[在Java映射中與最大值關聯的查找鍵](http://stackoverflow.com/questions/5911174/finding-key-associated-with-max-value-in-a-java-map ),並閱讀關於多個最大值接受的答案的評論 – sam

+0

@sam它有點不同,只有選項是set's'中的元素,我願意看到詳細的實現技巧。 如果我用pythonic風格編寫它,答案會是類似於 'Answer set = getKeysByValue(hm,Collections.max([hm。得到(項目)在s]))' – SUNDONG

+0

'一個可能的解決方案是隻找到最大值設置,然後使用該值與地圖中的值比較 – sam

回答

0

所以,你要檢查你的哈希表的價值,如果它對應於您的組鍵的條目&值對然後被添加到您的濃縮哈希映射?

在Python

def get_matching_values(my_set, my_dict): 
    new_dict = {} 
    for key, value in my_dict.iteritems(): 
     if value in my_set: 
      new_dict[key] = value 

    return new_dict 

或作爲字典解析

def get_matching_values(my_set, my_dict): 
    return dict((key, value) for key, value in my_dict.iteritems() if value in my_set) 
+0

是的,但這個問題是關於Java .. – SUNDONG

+0

你是對的,我誤解Python到Java作爲Java到Python。 –

0

如果您使用SortedSetTreeSet),而不是Set你可以調用SortedSet.last()獲得最大價值。

0

正如我在評論中說,你可以首先從組使用Collections.max(...)獲取最大價值,並使用該值的值在map

Set<Integer> set = new HashSet<Integer>(Arrays.asList(10,30,20,10)); 
int maxValueInSet = Collections.max(set); 

Map<String, Integer> hashMap = new HashMap<String, Integer>() {{ 
    put("a", 20); 
    put("b", 30); 
    put("c", 10); 
    put("d", 40); 
    put("e", 30); 
}}; 

for (Map.Entry<String, Integer> entry: hashMap.entrySet()) { 
    if (entry.getValue().equals(maxValueInSet)) { 
     System.out.println(entry.getKey()); 
    } 
} 

輸出比較:

b

e

Demo

+0

我的意圖設置爲 'Set set = new HashSet (Arrays.asList(「a」,「b」,「e」));' – SUNDONG

+0

@SUNDONG List是字符串,並且set是不能編譯的整數。假設set是一個整數,是否要將set中的最大字符串值與map中的max key進行比較? – sam

+0

我在原來的問題上增加了一段話,你可能會理解我的觀點。 – SUNDONG