【问题标题】:Finding Minimum 3 values from a list从列表中查找最少 3 个值
【发布时间】:2015-07-29 10:29:05
【问题描述】:

我正在做一个项目,我需要从 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

中找到最小值

【问题讨论】:

    标签: java hashmap comparator


    【解决方案1】:

    就我个人而言,我会简单地通过Collections.sort( ... ) 对列表进行排序(因为它似乎由 Comparables 组成),然后返回三个第一个(或最后一个)元素。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        你可以这样尝试。您无需自定义比较器即可实现您在此处尝试的功能。

            ArrayList<Integer> list = new ArrayList<Integer>();
        
            list.add(23);
            list.add(65);
            list.add(85);
            list.add(1);
            list.add(54);
            list.add(5);
        
            Collections.sort(list);
        
            for(int i=0;i<3;i++)
                System.out.println(list.get(i));
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 当他在寻找 3 个最低值时,这将无济于事。
          • 我同意,排序列表然后获取最后三个值会为您提供列表中最低的 3 个值
          • @Nitesh 我需要 3 个值而不是 1 个。
          • @Sheldon,试试 jude niroshan 的第 5 个答案
          • @sheldon 您也可以考虑在列表中查找最小值,将其从列表中删除并重复该过程,直到提取三个元素。
          【解决方案5】:

          涉及对地图排序的建议的运行时间为 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;
          }
          

          【讨论】:

            【解决方案6】:

            @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);
                }
            

            【讨论】:

            • 这只是简单地返回所有小于 3 的值并且不需要排序,除了输出将被排序。
            • 你可以更改值以及他想要的最小起始 3 个值,所以我认为这是个好方法。
            猜你喜欢
            • 2016-05-22
            • 2016-09-23
            • 1970-01-01
            • 2021-01-25
            • 2021-06-24
            • 1970-01-01
            • 2022-10-14
            • 2020-07-29
            • 2021-07-28
            相关资源
            最近更新 更多