【问题标题】:Finding first, second, third minimum in hash map在哈希图中查找第一、第二、第三最小值
【发布时间】:2019-12-06 03:55:09
【问题描述】:

我试图注意哈希映射中的最小值并在另一种方法中使用它的键。我也想重复执行此操作并排除先前找到的最小值。谢谢!

    Entry<Integer, Integer> min = null;
    for (Entry<Integer, Integer> entry : graph.myMap.entrySet()) {
        if (min == null || min.getValue() > entry.getValue()) {
            min = entry;
            int minV = min.getKey();
            deleteVertex(graph, minV);
        }
    }

【问题讨论】:

  • 如果你有 100 个人,并且你想找到最小的那个,你不可能知道是谁,直到你询问了 每个 个人的年龄。因此,只有在循环结束后 才能知道谁是最年轻的。但是您的代码会在找到第一个条目或任何低于之前条目的条目后立即删除一个顶点。
  • 最简单的方法是按值对条目进行排序,然后找到第一个、第二个、第三个最年轻的人就很简单了。
  • 是的 JB Nizet 谢谢我把最后两行放在 for 循环之外。另外,感谢 michalk 的建议,我应该根据价值观进行排序,这将使我的生活更轻松。
  • 您为此任务使用了错误的数据结构。

标签: java hash hashmap hashtable


【解决方案1】:

tl;博士

Map < Integer, Integer > myMap = Map.of ( 1 , 111 , 4 , 444 , 2 , 222 , 3 , 333 , 5 , 555 );
myMap.keySet().stream().sorted().limit( 3 ).map( key -> myMap.get( key ) ).forEach( System.out :: println ) ;

值:111

值:222

值:333

详情

首先关注键,对它们进行过滤和排序。

Set< Integer > allKeys = myMap.keySet() ;
List< Integer > sortedKeys = new ArrayList<>( allKeys ) ;
Collections.sort( sortedKeys ) ;

循环前三个键,从地图中获取匹配值。

for ( int index = 0 ; index < 3 ; index++ )
{
    Integer key = sortedKeys.get ( index );
    Integer value = myMap.get ( key );
    System.out.println ( "value: " + value );
}

看到这个code run live at IdeOne.com

值:111

值:222

值:333


或将列表截断为前三个。您可以拨打List::sublist。须知:

  • 新列表实际上是原始列表子集的视图。所以子列表和原始列表是绑定在一起的。要获得新的单独列表,我们必须将子列表提供给新列表。
  • 传递给subList 的数字是令人讨厌的从零开始的计数索引数字。
  • 索引是半开的,开始是inclusive,而结束是exclusive

代码。

List< Integer > targetKeys = new ArrayList< Integer >( sortedKeys.subList( 0 , 3 ) ) ;

现在循环三个元素的整个列表。

for ( Integer targetKey : targetKeys )
{
    Integer value = myMap.get ( targetKey );
    System.out.println ( "value: " + value );
}

看到这个code run live at IdeOne.com

值:111

值:222

值:333


或者,喜欢使用 Java Streams 的单线器。

Map < Integer, Integer > myMap = Map.of ( 1 , 111 , 4 , 444 , 2 , 222 , 3 , 333 , 5 , 555 );

myMap
.keySet ()
.stream ()
.sorted ()
.limit ( 3 )
.map ( key -> myMap.get ( key ) )
.forEach ( System.out :: println )
;

看到这个code run live at IdeOne.com

值:111

值:222

值:333

【讨论】:

  • @AndyTurner 是的,确实。固定的。谢谢。
【解决方案2】:

关于重复的第二部分不太了解,无论如何它可能会有所帮助:

 public static void main(String[] args) {
        Map<Integer, Integer> map = new HashMap<>();
        map.put(1,10);
        map.put(2,100);
        map.put(3,20);
        map.put(4,990);

        Map.Entry<Integer, Integer> integerIntegerEntry = map.entrySet()
                .stream().min(Comparator.comparing(Map.Entry::getKey))
                .orElseThrow(() ->new RuntimeException("Oops!"));
        System.out.println("min val is :" + integerIntegerEntry.getValue());
        anotherMethod(integerIntegerEntry.getKey());
    }

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2022-01-22
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多