gpt4 book ai didi

java - 如何在 map 中有效地找到最高值的最低键,并限制它可以包含重复值?

转载 作者:行者123 更新时间:2023-12-01 23:28:34 24 4
gpt4 key购买 nike

我的疑问是因为这个特殊问题而提出的:

https://www.hackerrank.com/challenges/migratory-birds/problem?h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen

我知道可以通过以下方式轻松解决:

  1. 将频率存储在 map 中
  2. 初始化两个临时变量a,b
  3. 开始循环

     - Store the current max value & key to a,b
    - If we find similar value: store the lowest key pair to b.
  4. 返回b值

* 但我不想这样做。我想使用 Streams 来解决 Map 的问题 *

输入 arr 包含 11 个值,1 2 2 2 3 4 5 5 4 3 4

输出应该是2

说明1

不同类型的鸟类出现的频率如下:

  • 类型 1:1
  • 类型 2:3
  • 类型 3:2
  • 类型 4:3
  • 类型 5:2

两种类型的频率为 3,其中较低的为类型 2

我尝试了下面的代码,它确实有效,但我不知道如何。我使用了 max 函数,预计会收到错误,因为我的示例中有两个最大值为 3 的值。

但是看看我使用 Collections.max 的 migratoryBirds() 函数,查询返回了具有最高值的最低键的映射条目。

import java.io.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toList;

public class Solution{

// Complete the migratoryBirds function below.
static int migratoryBirds(List<Integer> arr) {
Map<Integer,Integer> map = new HashMap<>();
int temp=0;
for(int val : arr){
if(map.containsKey(val)){
temp=map.get(val);
map.put(val,temp+1);
}else{
map.put(val,1);
}
}
Map.Entry<Integer,Integer> maxEntry = Collections.max(map.entrySet(),
(e1, e2) -> e1.getValue().compareTo(e2.getValue()));
return maxEntry.getKey();
}

public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

int arrCount = Integer.parseInt(bufferedReader.readLine().trim());

List<Integer> arr = Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
.map(Integer::parseInt)
.collect(toList());

int result = migratoryBirds(arr);

bufferedWriter.write(String.valueOf(result));
bufferedWriter.newLine();

bufferedReader.close();
bufferedWriter.close();
}
}

谁能解释一下为什么我得到了预期的结果,并建议使用 Map Streams 的正确替代方法。

抱歉,如果我的问题很奇怪,我喜欢研究所有可能的方法。

最佳答案

您可以使用的是:

int minKeyWithMaxValueEntry = map.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey,
Integer::min, TreeMap::new))
.lastEntry()
.getValue();

详细说明收集操作:

  • 它将初始映射条目中的值存储为,相应地,条目中的每个键都会转换为结果映射的

  • 由于可能存在多个具有相同值的键,因此合并函数 Integer::min 选择其中的最小值。

  • 所有这些都存储在 TreeMap 中,以确保生成的 Map 通过比较其键进行排序。

  • 选择最后一个条目(初始映射中的最大值),并将最终映射中的值存储为输出。

关于java - 如何在 map 中有效地找到最高值的最低键,并限制它可以包含重复值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58299194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com