在哈希图中查找第一、第二、第三最小值
Finding first, second, third minimum in hash map
我试图注意哈希映射中的最小值并在另一种方法中使用它的键。我也想重复这样做并排除以前找到的最小值。谢谢!
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);
}
}
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 ) ;
value: 111
value: 222
value: 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。
value: 111
value: 222
value: 333
或将列表截断为前三个。你可以打电话给List::sublist
。须知:
- 新列表实际上是原始列表子集的视图。所以子列表和原始列表是捆绑在一起的。要获得新的单独列表,我们必须将子列表提供给新列表。
- 传递给
subList
的数字是令人讨厌的从零开始的计数索引数字。
- 索引是半开的,开始是包含而结束是不包含。
代码。
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。
value: 111
value: 222
value: 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。
value: 111
value: 222
value: 333
关于repeat的第二部分不是很明白,无论如何它可能会有所帮助:
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());
}
我试图注意哈希映射中的最小值并在另一种方法中使用它的键。我也想重复这样做并排除以前找到的最小值。谢谢!
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);
}
}
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 ) ;
value: 111
value: 222
value: 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。
value: 111
value: 222
value: 333
或将列表截断为前三个。你可以打电话给List::sublist
。须知:
- 新列表实际上是原始列表子集的视图。所以子列表和原始列表是捆绑在一起的。要获得新的单独列表,我们必须将子列表提供给新列表。
- 传递给
subList
的数字是令人讨厌的从零开始的计数索引数字。 - 索引是半开的,开始是包含而结束是不包含。
代码。
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。
value: 111
value: 222
value: 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。
value: 111
value: 222
value: 333
关于repeat的第二部分不是很明白,无论如何它可能会有所帮助:
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());
}