2012-04-04 3 views
4

Привет У меня есть следующий объект:Ключ для максимального значения в Hashtable

Hashtable<Object, Double> 

и я хочу, чтобы найти ключ от максимального двойного значения в таблице. Самый простой способ сделать это? не

Благодаря

+2

Вы должны были бы перебрать все ключи. –

ответ

5

Там будет не встроенная функция, чтобы получить максимальное значение из Hashtable вы будете иметь, чтобы перебрать все ключи и вручную определить макс.

Object maxKey=null; 
Double maxValue = Double.MIN_VALUE; 
for(Map.Entry<Object,Double> entry : table.entrySet()) { 
    if(entry.getValue() > maxValue) { 
     maxValue = entry.getValue(); 
     maxKey = entry.getKey(); 
    } 
} 

Edit: Для того, чтобы найти более 1 ключ для максимального значения

ArrayList<Object> maxKeys= new ArrayList<Object>(); 
Double maxValue = Double.MIN_VALUE; 
for(Map.Entry<Object,Double> entry : table.entrySet()) { 
    if(entry.getValue() > maxValue) { 
     maxKeys.clear(); /* New max remove all current keys */ 
     maxKeys.add(entry.getKey()); 
     maxValue = entry.getValue(); 
    } 
    else if(entry.getValue() == maxValue) 
    { 
     maxKeys.add(entry.getKey()); 
    } 
} 
+0

Могу ли я знать, что произойдет, если их два наивысших значения? что я должен сделать, чтобы найти оба значения ключа? thx заранее – Learner

+1

@Learner проверяет редактирование, чтобы обрабатывать несколько ключей с одинаковым максимальным значением – twain249

0

Вы можете обходить и найти максимальное значение:

public static void main(String[] args) { 
    Map<Object, Double> maps = new HashMap<Object, Double>(); 
    maps.put("5", new Double(50.0)); 
    maps.put("4", new Double(40.0)); 
    maps.put("2", new Double(20.0)); 
    maps.put("1", new Double(100.0)); 
    maps.put("3", new Double(30.0)); 
    maps.put("5", new Double(50.0)); 

    Double max = Double.MIN_VALUE; 
    for(Object key: maps.keySet()) { 
     Double tmp = maps.get(key); 
     if(tmp.compareTo(max) > 0) { 
      max = tmp; 
     } 
    } 

    System.out.println(max); 
} 
0

Там нет конкретного метода библиотеки это, но вы можете сделать, как показано ниже

Hashtable<Object, Double> hashTable = new Hashtable<Object, Double>(); 
      hashTable.put("a", 10.0); 
      hashTable.put("b", 15.0); 
      hashTable.put("c", 18.0); 

      Collection<Double> values = hashTable.values(); 
      Double maxValue = Collections.max(values); 
      Enumeration<Object> keys = hashTable.keys(); 
      while(keys.hasMoreElements()){ 
       Object key = keys.nextElement(); 
       if((hashTable.get(key)).equals(maxValue)) 
        System.out.println(key); 
      } 
4

Если это действительно важно, чтобы вы сделать это без перебора всех ключей, просто расширить HashTable

class MyHashtable extends Hashtable<Object, Double> { 

    private Double maxValue = Double.MIN_VALUE; 

    @Override 
    public synchronized Double put(Object k, Double v) { 
     maxValue = Math.max(maxValue, v); 
     return super.put(k, v); 
    } 

    @Override 
    public synchronized void clear() { 
     super.clear(); 
     maxValue = Double.MIN_VALUE; 
    } 

    public Double getMaxValue() { 
     return maxValue; 
    } 

    @Override 
    public synchronized Double remove(Object key) { 
     // TODO: Left as an Excercise for the user, refer the other answers 
     return super.remove(key); 
    } 
} 
0

есть важная Поймать-я здесь: Там может быть более чем одна запись с тем же MAX двойным значением.

import java.util.ArrayList; 
import java.util.Hashtable; 
import java.util.List; 
import java.util.Map; 


public class HashtableTest { 

    public static void main(String[] args){ 
     Hashtable<Object, Double> table = new Hashtable<Object, Double>(); 
    table.put("a", 10.0); 
    table.put("b", 15.0); 
    table.put("c", 18.0); 
    table.put("d", 18.0); 


     List<Object> maxKeyList=new ArrayList<Object>(); 
     Double maxValue = Double.MIN_VALUE; 
     for(Map.Entry<Object,Double> entry : table.entrySet()) { 
      if(entry.getValue() > maxValue) { 
       maxValue = entry.getValue(); 
       maxKeyList.add(entry.getKey()); 
      } 
     } 
     System.out.println("All max Keys : "+maxKeyList); 
    } 
} 

Результат: Все максимальные клавиши: [б, г]

+0

Могу ли я узнать, что произойдет, если их два самых высоких значения? – Learner

+0

Что я могу сделать, чтобы найти оба значения ключа – Learner

+2

Это находит все ключи, которые заменяют старое максимальное значение. С вашим набором тестов он должен был возвращать 'c' и 'd' not 'b' и 'd'. – twain249

Смежные вопросы