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和选择匹配的第一个单词的想法分开。