6

我在 java 中有一个 Hashtable,如下所示,我正在尝试获取具有最小值的键。显然我可以遍历所有元素来找到它,但是有没有更简单的方法呢?

Hashtable<Object, Integer> hash= new Hashtable<Object, Integer>();
4

4 回答 4

10

使用哈希表,不。但是您可以改为使用TreeMap.

基于红黑树的NavigableMap实现。地图根据其键的自然顺序排序,或者由地图创建时提供的 Comparator 排序,具体取决于使用的构造函数。

它有一种方法firstKey()可以提供您想要的确切功能。


Grr,值,而不是键。不,那么您将需要迭代。

我会说在这种情况下您应该使用单独的地图(Multimap?)来存储反向关联。

Map<Object, Integer> hash= new Hashtable<Object, Integer>();
SortedSetMultimap<Integer, Object> reverse = TreeMultimap.create();

每当你把keyvalue东西放进去hash,也放进去valuekey放进去reverse。然后使用检索最小值reverse.keySet().first()

(此解决方案需要Guava

于 2012-10-02T14:59:35.543 回答
3

您可以使用库函数Collections.min(Collection,Comparator)而不是自己迭代entrySet()

样本

public static void main(String[] args) {


    HashMap<String,Integer> map = new HashMap<String,Integer>();

    map.put("A", 1);
    map.put("B", 2);
    map.put("C", 3);

    System.out.println( 

    Collections.min(map.entrySet(), new Comparator<Map.Entry<String,Integer>>() {

        @Override
        public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {

            return o1.getValue().intValue() - o2.getValue().intValue();

        }})

        .getKey()


    );
}
于 2012-10-02T15:12:59.083 回答
0

也可以通过这种方式找到最小值,

    Hashtable h = new Hashtable();
    h.put(10, "aaa");
    h.put(1, "aab");
    h.put(12, "aabwqkjdg");

    Set set = h.keySet();

    TreeSet treeSet= new TreeSet();
    treeSet.addAll(set);

    System.out.println("Last :"+treeSet.first());

我只是将键作为整数的例子。

于 2012-10-02T15:38:57.983 回答
0

看起来最简单的方法实际上是迭代元素。如果 Hashtable 名称是 hash:

Object minObj= null;
int min= Integer.MAX_VALUE;
for(Map.Entry<Object, Integer> x: hash.entrySet()){
    if(x.getValue() < min){
            min= x.getValue();
            minObj= x.getKey();
    }
}
于 2012-10-02T15:24:26.120 回答