Hi I have the following object:
Hashtable<Object, Double>
and I want to find the key of the maximum Double value in the table. Easiest way to do that?
Thanks
Hi I have the following object:
Hashtable<Object, Double>
and I want to find the key of the maximum Double value in the table. Easiest way to do that?
Thanks
There is no built in function to get the maximum value out of a Hashtable
you are going to have to loop over all the keys and manually determine the max.
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: To find more than 1 key for the max value
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());
}
}
If it's really important you do it without iterating all keys, simply extend 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);
}
}
You can loop through and find the max value:
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);
}
There is no specific library method for it, but you can do as below
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);
}
there is an important Catch-ya here: There could be more than one entry with the same MAX double value.
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);
}
}
result: All max Keys : [b, d]