【无标题】 以你之姓@ 2024-03-25 21:32 2阅读 0赞 给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter 96 jack 70 Tom 70 smith 67 从低到高 smith 67 jack 70 Tom 70 peter 96 注:0代表从高到低,1代表从低到高 输入描述: 第一行输入要排序的人的个数n,第二行输入一个整数表示排序的方式,之后n行分别输入他们的名字和成绩,以一个空格隔开 #### 输出描述: #### 按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开 > 输入: > > 3 > 0 > fang 90 > yang 50 > ning 70 > 输出: > > fang 90 > ning 70 > yang 50 解题思路: 本想着用linkedHashMap直接排序解,结果这里面有同名不同分的。这样会覆盖掉之前同key的value值。。。。。 还是贴上吧,无论如何加强了hashMap排序的写法 import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int reverse = in.nextInt(); LinkedHashMap<String, Integer> map = new LinkedHashMap<>(); for (int i = 0; i <= n; i++) { String t = in.nextLine(); if(t.length() == 0) continue; String[] name = t.split(" "); // System.out.println(t); String name1 = name[0]; String grade = name[1]; map.put(name1, Integer.valueOf(grade)); } List<Map.Entry<String, Integer>> entryList = new ArrayList<>(map.entrySet()); for (Map.Entry<String, Integer> s : entryList) { System.out.println(s.getKey() + " " + s.getValue()); } // System.out.print(entryList.size()); if (reverse == 0) { Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> s1, Map.Entry<String, Integer>s2) { int g1 = s1.getValue(), g2 = s2.getValue(); return g2 - g1; } }); } else { Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> s1, Map.Entry<String, Integer>s2) { int g1 = s1.getValue(), g2 = s2.getValue(); return g1 - g2; } }); } // for (Map.Entry<String, Integer> s : entryList) { // System.out.println(s.getKey() + " " + s.getValue()); // } } } 正确做法: * 通过一个二维数组,每一行包括姓名编号,成绩,将输入的姓名用编号代替,第二列保存成绩 * 自定义排序 * 倒序,按第二列的成绩降序排列,如果相等的话,返回0,顺序不变,因为默认编号是升序的,符合题意 * 升序则 按成绩升序排序 * 最后根据已经排序后的数组,顺序输出结果 import java.util.*; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); HashMap<Integer,String> map = new HashMap<>(); while(sc.hasNextLine()){ // 学生成绩数 int n = Integer.parseInt(sc.nextLine()); //1是升序,0是降序 int flag = Integer.parseInt(sc.nextLine()); // 每一行包括姓名编号,成绩 int[][] score = new int[n][2]; for(int i=0;i<n;i++){ String[] nameAndScore = sc.nextLine().split(" "); // 学生用编号代替 score[i][0] = i; score[i][1] = Integer.parseInt(nameAndScore[1]); map.put(i,nameAndScore[0]); } // 自定义排序 Arrays.sort(score,(o1,o2) ->{ // 倒序,按第二列的成绩降序排列,如果相等的话,返回0,顺序不变,因为默认编号是升序的,符合题意 if(flag==0){ return o2[1] - o1[1]; }else{ // 按成绩升序排序 return o1[1] - o2[1]; } }); // 根据已经排序后的数组,顺序输出结果 for(int i=0;i<n;i++){ System.out.println(map.get(score[i][0]) + " " + score[i][1]); } } } } java中的linkedHashMap的lambda形式的排序如下: LinkedHashMap<Integer, String> map = new LinkedHashMap<>(); map.put(1, "apple"); map.put(2, "banana"); map.put(3, "orange"); // 使用lambda表达式对LinkedHashMap进行倒序排序 LinkedHashMap<Integer, String> reversedMap = map.entrySet() .stream() .sorted(Map.Entry.<Integer, String>comparingByKey().reversed()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new)); // 输出倒序排列后的LinkedHashMap System.out.println(reversedMap); 在上面的示例代码中,`.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new))`这一行代码用于将流中的元素收集到一个新的LinkedHashMap对象中。 该方法有四个参数,分别为: 1. `Map.Entry::getKey`:指定用于生成新Map的键值的提取函数,这里使用了Java 8中的方法引用来获取键值。 2. `Map.Entry::getValue`:指定用于生成新Map的键值的提取函数,同样使用方法引用来获取键值。 3. `(oldValue, newValue) -> oldValue`:指定用于解决键冲突的合并函数,这里我们简单地返回旧值,表示当发生键冲突时保留旧值。 4. `LinkedHashMap::new`:指定用于生成新Map的构造函数,这里使用了LinkedHashMap的无参构造函数。 这里的`(oldValue, newValue) -> oldValue`是一个Lambda表达式,其参数`oldValue`和`newValue`分别表示相同键的旧值和新值。在这里,我们简单地返回了旧值,即`oldValue`,这意味着当相同的键值出现时,我们将保留旧值,而不是使用新值。
相关 【无标题】 C 语言接口如何定义和继承? 在 C 语言中,接口通常通过定义结构体来实现,结构体中包含一些函数指针,这些函数指针定义了接口所需的所有函数。 下面是一个示例代码: 谁践踏了优雅/ 2024年03月26日 11:40/ 0 赞/ 76 阅读
相关 【无标题】 -------------------- springboot web项目框架结构 -------------------- SpringBoot 是一个基于 Spr 女爷i/ 2024年03月25日 20:00/ 0 赞/ 27 阅读
相关 【无标题】 大家可以回想一下,当初我们最开始学习Java的时候,搭建一个Web所需要的步骤。。。 1、配置web.xml,加载spring和spring mvc 2、配置数据库连接、配 深藏阁楼爱情的钟/ 2024年03月23日 18:43/ 0 赞/ 20 阅读
相关 【无标题】 铜三铁四已经结束了,但还是有很多Java程序员没有找到工作或者成功跳槽,跳槽成功的也只是从一个坑中,跳入另一个坑中…… ![4cf6db4c14b524cd5c2d29fdd 曾经终败给现在/ 2023年10月10日 23:52/ 0 赞/ 16 阅读
相关 【无标题】 铜三铁四已经结束了,但还是有很多Java程序员没有找到工作或者成功跳槽,跳槽成功的也只是从一个坑中,跳入另一个坑中…… ![4cf6db4c14b524cd5c2d29fdd r囧r小猫/ 2023年10月10日 23:52/ 0 赞/ 17 阅读
相关 【无标题】 铜三铁四已经结束了,但还是有很多Java程序员没有找到工作或者成功跳槽,跳槽成功的也只是从一个坑中,跳入另一个坑中…… ![4cf6db4c14b524cd5c2d29fdd 电玩女神/ 2023年10月10日 23:51/ 0 赞/ 19 阅读
相关 【无标题】 铜三铁四已经结束了,但还是有很多Java程序员没有找到工作或者成功跳槽,跳槽成功的也只是从一个坑中,跳入另一个坑中…… ![4cf6db4c14b524cd5c2d29fdd 谁践踏了优雅/ 2023年10月10日 23:51/ 0 赞/ 22 阅读
相关 【无标题】 注意事项 int 宽度是显示宽度,如果超过,可以自动增大宽度 int底层都是4个字节 时间的方式多样 '1256-12-23' "1256/12/23" "1256.12. 朴灿烈づ我的快乐病毒、/ 2023年09月27日 14:57/ 0 赞/ 115 阅读
相关 【无标题】 3.5.1 闭包的基本技能点 闭包的定义: 闭包就是一段代码块,用\{\}括起来: def c = { println 'hi groovy'} ![d5c9c 以你之姓@/ 2023年09月27日 14:51/ 0 赞/ 120 阅读
相关 【无标题】 昨晚和知识星球的一位同学 1对1 沟通,聊了很多关于团队管理、质量体系构建和个人职业发展的话题。 这位同学本身就具有多年的大厂背景,在技术实践、团队管理管理方面有丰富的经验。 待我称王封你为后i/ 2023年09月25日 19:00/ 0 赞/ 132 阅读
还没有评论,来说两句吧...