在 Java 映射中查找与 max Value 相关联的键

获得与映射中的 max 值相关联的键的最简单的方法是什么?

我相信 Collections.max (some Map)将返回 max Key,当您需要与 max 值对应的键时。

358065 次浏览

基本上,您需要遍历映射的条目集,同时记住“当前已知的最大值”和与之相关的键。(当然,也可以只包含这两个条目。)

例如:

Map.Entry<Foo, Bar> maxEntry = null;


for (Map.Entry<Foo, Bar> entry : map.entrySet())
{
if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
{
maxEntry = entry;
}
}

此代码将打印所有具有最大值的键

public class NewClass4 {
public static void main(String[] args)
{
HashMap<Integer,Integer>map=new HashMap<Integer, Integer>();
map.put(1, 50);
map.put(2, 60);
map.put(3, 30);
map.put(4, 60);
map.put(5, 60);
int maxValueInMap=(Collections.max(map.values()));  // This will return max value in the HashMap
for (Entry<Integer, Integer> entry : map.entrySet()) {  // Iterate through HashMap
if (entry.getValue()==maxValueInMap) {
System.out.println(entry.getKey());     // Print the key with max value
}
}


}
}

下面是如何通过定义适当的 Comparator来直接实现(不需要显式的额外循环) :

int keyOfMaxValue = Collections.max(
yourMap.entrySet(),
new Comparator<Entry<Double,Integer>>(){
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
return o1.getValue() > o2.getValue()? 1:-1;
}
}).getKey();

为了完整起见,这里有一个 的实现方法

countMap.entrySet().stream().max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1).get().getKey();

或者

Collections.max(countMap.entrySet(), (entry1, entry2) -> entry1.getValue() - entry2.getValue()).getKey();

或者

Collections.max(countMap.entrySet(), Comparator.comparingInt(Map.Entry::getValue)).getKey();

在我的项目中,我使用了 Jon 和 Fathah 的解决方案的一个稍微修改过的版本。对于具有相同值的多个条目,它返回找到的最后一个条目:

public static Entry<String, Integer> getMaxEntry(Map<String, Integer> map) {
Entry<String, Integer> maxEntry = null;
Integer max = Collections.max(map.values());


for(Entry<String, Integer> entry : map.entrySet()) {
Integer value = entry.getValue();


if(null != value && max == value) {
maxEntry = entry;
}
}


return maxEntry;
}

这个方法可以吗?

int[] a = { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7 };
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i : a) {
Integer count = map.get(i);
map.put(i, count != null ? count + 1 : 0);
}
Integer max = Collections.max(map.keySet());
System.out.println(max);
System.out.println(map);

你可以这么做

HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
hm.put(1,10);
hm.put(2,45);
hm.put(3,100);
Iterator<Integer> it = hm.keySet().iterator();
Integer fk = it.next();
Integer max = hm.get(fk);
while(it.hasNext()) {
Integer k = it.next();
Integer val = hm.get(k);
if (val > max){
max = val;
fk=k;
}
}
System.out.println("Max Value "+max+" is associated with "+fk+" key");

一个使用 Java-8的简单的一行程序

Key key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();

返回一个可选的答案,因为如果 map 为空,它可能没有最大值: map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);

Java8获取所有具有最大值的键的方法。

Integer max = PROVIDED_MAP.entrySet()
.stream()
.max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1)
.get()
.getValue();


List listOfMax = PROVIDED_MAP.entrySet()
.stream()
.filter(entry -> entry.getValue() == max)
.map(Map.Entry::getKey)
.collect(Collectors.toList());


System.out.println(listOfMax);

也可以通过使用 parallelStream()而不是 stream()来并行化它

我有两个方法,使用这个方法得到带有 max 值的键:

 public static Entry<String, Integer> getMaxEntry(Map<String, Integer> map){
Entry<String, Integer> maxEntry = null;
Integer max = Collections.max(map.values());


for(Entry<String, Integer> entry : map.entrySet()) {
Integer value = entry.getValue();
if(null != value && max == value) {
maxEntry = entry;
}
}
return maxEntry;
}

例如,使用这个方法获得带有 max 值的 Entry:

  Map.Entry<String, Integer> maxEntry =  getMaxEntry(map);

使用 爪哇8我们可以得到一个包含最大值的对象:

Object maxEntry = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();


System.out.println("maxEntry = " + maxEntry);

1. 使用 Stream

public <K, V extends Comparable<V>> V maxUsingStreamAndLambda(Map<K, V> map) {
Optional<Entry<K, V>> maxEntry = map.entrySet()
.stream()
.max((Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
.compareTo(e2.getValue())
);
     

return maxEntry.get().getKey();
}

2. 对 Lambda 表达式使用 Collections.max ()

    public <K, V extends Comparable<V>> V maxUsingCollectionsMaxAndLambda(Map<K, V> map) {
Entry<K, V> maxEntry = Collections.max(map.entrySet(), (Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
.compareTo(e2.getValue()));
return maxEntry.getKey();
}

3. 使用方法参考流

    public <K, V extends Comparable<V>> V maxUsingStreamAndMethodReference(Map<K, V> map) {
Optional<Entry<K, V>> maxEntry = map.entrySet()
.stream()
.max(Map.Entry.comparingByValue());
return maxEntry.get()
.getKey();
}

4. 使用 Collections.max ()

    public <K, V extends Comparable<V>> V maxUsingCollectionsMax(Map<K, V> map) {
Entry<K, V> maxEntry = Collections.max(map.entrySet(), new Comparator<Entry<K, V>>() {
public int compare(Entry<K, V> e1, Entry<K, V> e2) {
return e1.getValue()
.compareTo(e2.getValue());
}
});
return maxEntry.getKey();
}

5. 使用简单迭代

public <K, V extends Comparable<V>> V maxUsingIteration(Map<K, V> map) {
Map.Entry<K, V> maxEntry = null;
for (Map.Entry<K, V> entry : map.entrySet()) {
if (maxEntry == null || entry.getValue()
.compareTo(maxEntry.getValue()) > 0) {
maxEntry = entry;
}
}
return maxEntry.getKey();
}
int maxValue = 0;
int mKey = 0;
for(Integer key: map.keySet()){
if(map.get(key) > maxValue){
maxValue = map.get(key);
mKey = key;
}
}
System.out.println("Max Value " + maxValue + " is associated with " + mKey + " key");

映射中的多数元素/max 元素:

public class Main {
public static void main(String[] args) {
int[] a = {1,3,4,3,4,3,2,3,3,3,3,3};
List<Integer> list = Arrays.stream(a).boxed().collect(Collectors.toList());
Map<Integer, Long> map = list.parallelStream()
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
System.out.println("Map => " + map);
//{1=1, 2=1, 3=8, 4=2}
map.entrySet()
.stream()
.max(Comparator.comparing(Entry::getValue))//compare the values and get the maximum value
.map(Entry::getKey)// get the key appearing maximum number of times
.ifPresentOrElse(System.out::println,() -> new RuntimeException("no such thing"));


/*
* OUTPUT : Map => {1=1, 2=1, 3=8, 4=2}
* 3
*/
// or in  this way
System.out.println(".............");
Integer maxAppearedElement = map.entrySet()
.parallelStream()
.max(Comparator.comparing(Entry::getValue))
.map(Entry::getKey)
.get();
System.out.println(maxAppearedElement);


}
}

给定地图

HashMap = new HashMap < > () ;

获取具有最大值的所有映射条目。

您可以使用筛选器中的以下任何方法来获取最小值或最大值集合的各自映射条目

Collections.max(abc.values())
Collections.min(abc.values())
Collections.max(abc.keys())
Collections.max(abc.keys())


abc.entrySet().stream().filter(entry -> entry.getValue() == Collections.max(abc.values()))

如果只想获取过滤器映射的键

abc.entrySet()
.stream()
.filter(entry -> entry.getValue() == Collections.max(abc.values()))
.map(Map.Entry::getKey);

如果要获取筛选映射的值

abc.entrySet()
.stream()
.filter(entry -> entry.getValue() == Collections.max(abc.values()))
.map(Map.Entry::getvalue)

如果您希望获得列表中的所有这些键:

abc.entrySet()
.stream()
.filter(entry -> entry.getValue() == Collections.max(abc.values()))
.map(Map.Entry::getKey)
.collect(Collectors.toList())

如果要在列表中获取所有这些值:

abc.entrySet()
.stream()
.filter(entry -> entry.getValue() == Collections.max(abc.values()))
.map(Map.Entry::getvalue)
.collect(Collectors.toList())

很容易理解。 在下面的代码中,maxKey 是保存 max 值的键。

int maxKey = 0;
int maxValue = 0;
for(int i : birds.keySet())
{
if(birds.get(i) > maxValue)
{
maxKey = i;
maxValue = birds.get(i);
}
}

这将返回 Map<Integer, Integer>中带有 max 值的键

public Set<Integer> getMaxKeys(Map<Integer, Integer> map) {


if (map.isEmpty()) {
return Collections.emptySet();
}


return map
.entrySet()
.stream()
.collect(
groupingBy(
Map.Entry::getValue, TreeMap::new, mapping(Map.Entry::getKey, toSet())
)
)
.lastEntry()
.getValue();
}

最简单的方法是:

Collections.max(hmap.values());

科特林 :

val key = map.toList().groupingBy { it }.eachCount().maxByOrNull { it.value }?.key
    int max = 0;
// here m is a HashMap<String, Integer>
for(Map.Entry<String,Integer> entry : m.entrySet()){


if(entry.getValue() > max){
max = entry.getValue();
}
}