Java 如果有多个这样的数字,如何输出键集中的最大数字?

Java 如果有多个这样的数字,如何输出键集中的最大数字?,java,Java,如果有几个这样的数字,如何输出最大的字?(应输出较早发生的一个)。我的代码工作不正常 import java.io.*; import java.util.*; public class solved { public static void main(String[] args) { LinkedHashMap<Integer, String> hashMap = new LinkedHashMap<>(); Scanner sc

如果有几个这样的数字,如何输出最大的字?(应输出较早发生的一个)。我的代码工作不正常

import java.io.*;
import java.util.*;
public class solved {
    public static void main(String[] args) {
        LinkedHashMap<Integer, String> hashMap = new LinkedHashMap<>();
        Scanner scan = new Scanner(System.in);
        String[] str = scan.nextLine().split(" ");
        for (int i=1; i < str.length; i++) {
             int n = str[i].length();
             String s = str[i];
             hashMap.put(n, s);
         }
         int maxKey = Collections.max(hashMap.keySet());
         System.out.println(hashMap.get(maxKey));
    }
}
import java.io.*;
导入java.util.*;
公共类解决方案{
公共静态void main(字符串[]args){
LinkedHashMap hashMap=新LinkedHashMap();
扫描仪扫描=新扫描仪(System.in);
字符串[]str=scan.nextLine().split(“”);
对于(int i=1;i
您可以使用以避免写入现有值并保留最早的值

for (int i=1; i < str.length; i++) {
    int n = str[i].length();
    String s = str[i];
    hashMap.putIfAbsent(n, s); 
}
for(int i=1;i

⚠️ 在
1
处启动
i
会使第一个单词未使用。小心,数组是
0索引的
,因此从
0
处启动以获取每个单词

因为您使用的是
哈希映射
,如果以后有一个带有重复键的条目,则会覆盖以前的条目。解决这个问题的一种方法是使用
地图
,但这太复杂了。最好是这样做:

int longestN = -1;
String longest;
for (String s : str) {
  int n = s.length();
  if (n > longestN) {
    longestN = n;
    longest = s;
  }
}
System.out.println(longest);

是否要存储所有单词?在你的例子中,“狗”将取代“猫”,因此你失去了第一个单词。如果要存储所有单词,则不能在
HashMap
中使用
整数作为键,因为每个值只能有一个键

如果要保留所有单词供以后使用,可以将贴图反转为
map
——并将单词用作键,将长度用作值。或者,您可以完全跳过使用集合:

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String[] str = scan.nextLine().split(" ");

    int longestWordLength = -1;
    for (String s : str) {
        if (s.length() > longestWordLength)
            longestWordLength = s.length();
    }

    for (String s : str) {
        if (s.length() == longestWordLength)
            System.out.printf("Longest word: %s is %s", s, s.length());
    }
}
或者,使用Java 8流进行娱乐和学习:

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String[] str = scan.nextLine().split(" ");

    int longest = Arrays.stream(str)
            .mapToInt(String::length).max().orElse(-1);
    Predicate<String> isLongest = s -> s.length() == longest;
    String firstLongest = Arrays.stream(str)
            .filter(isLongest).findFirst().orElse("no words");

    System.err.println(firstLongest + " " + longest);
}
publicstaticvoidmain(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
字符串[]str=scan.nextLine().split(“”);
int longest=Arrays.stream(str)
.mapToInt(字符串::长度).max().orElse(-1);
谓词isLongest=s->s.length()==longest;
字符串firstLongest=Arrays.stream(str)
.filter(isLongest).findFirst().orElse(“无字”);
System.err.println(firstLongest+“”+longest);
}

Collectors.maxBy()
的效率不会更高一点,因为您没有两次查看列表(虽然我想性能在这里并不重要)?正如您所指出的,这里不追求效率。即使是循环,我也会做两次,所以你的例子肯定更好——只是想保持查找max和选择匹配的第一个单词的想法分开。