从列表中查找最少3个值

时间:2015-07-29 10:29:05

标签: java hashmap comparator

我正在开发项目,我需要从 HashMap 中找到最少3个三个值。我找到了一个找到最高值的代码。在这里。

public static <K, V extends Comparable<? super V>> List<Entry<K, V>> 

    findGreatest(Map<K, V> map, int n)
    {
    Comparator<? super Entry<K, V>> comparator = 
        new Comparator<Entry<K, V>>()
    {
        public int compare(Entry<K, V> e0, Entry<K, V> e1)
        {
            V v0 = e0.getValue();
            V v1 = e1.getValue();
            return v0.compareTo(v1);
        }
    };
    PriorityQueue<Entry<K, V>> highest = 
        new PriorityQueue<Entry<K,V>>(n, comparator);
    for (java.util.Map.Entry<K, V> entry : map.entrySet())
    {
        highest.offer(entry);
        while (highest.size() > n)
        {
            highest.poll();
        }
    }

    List<Entry<K, V>> result = new ArrayList<Map.Entry<K,V>>();
    while (highest.size() > 0)
    {
        result.add(highest.poll());
    }
    return result;
    }

如何修改它以找到最小值? 请帮助我。 更新:抱歉我的错误,我希望从 HashMap

中找到最小值

6 个答案:

答案 0 :(得分:3)

就个人而言,我只是简单地通过"#,##0.##" 对列表进行排序(因为它似乎包含了可比较的数据),然后返回三个第一个(或最后一个)元素。

答案 1 :(得分:1)

除了使用Collections.reverseOrder(Comparator c)反转Comparator的顺序外,您可以使用完全相同的代码。

PriorityQueue<Entry<K, V>> highest = 
    new PriorityQueue<Entry<K,V>>(n, Collections.reverseOrder(comparator));

但是,这不是最有效的方法。可以一次性完成这项工作。

答案 2 :(得分:1)

您可以尝试这样做。你不需要有一个定制的比较器来实现你在这里尝试的东西。

driver.SwitchTo().Window(driver.WindowHandles.ToList().Last());

答案 3 :(得分:0)

您可以使用Collections.min(list)从列表中获取最低值

答案 4 :(得分:0)

涉及对地图进行排序的建议的运行时间为O(n log(n))。以下实现的运行时间为O(n m),其中n是映射的大小,m是结果的大小,即如果你想要m个最小的元素。

public static <K, V extends Comparable<? super V>> List<Entry<K, V>> findGreatest(Map<K, V> map, int m)
{
    LinkedList<Entry<K, V>> result = new LinkedList<Entry<K, V>>();

    for (Entry<K, V> entry : map.entrySet())
    {
        ListIterator<Entry<K, V>> iterator = result.listIterator();
        int i = n;
        while (iterator.hasNext() && i-- > 0)
        {
            if (iterator.next().getValue().compareTo(entry.getValue()) > 0)
            {
                iterator.previous();
                iterator.add(entry);
                if (result.size() > n)
                {
                    result.removeLast();
                }
                break;
            }
        }

        if (result.size() < n)
        {
            result.add(entry);
        }
    }

    return result;
}

答案 5 :(得分:0)

@Jude Niroshan,他的回答也是正确的 你也可以试试这个,如果它有帮助,你可以改变值并检查。

LinkedList<Integer> li=new LinkedList<Integer>();
    li.add(-8);
    li.add(0);
    li.add(10);
    li.add(-1);
    li.add(9);
Collections.sort(li);
for(Integer a:li){
        if(a<3)
        System.out.println(a);
    }