Java报错Sortbyname无法解析为类型,求助板球运动员Comparator排序问题
搞定「Sortbyname cannot be resolved to a type」这个编译错误
作为Java初学者刚接触Comparator排序时踩这种坑太正常了!结合你给出的代码片段,我来帮你把问题理清楚,一步一步解决:
问题出在哪?
从你贴的代码看,你定义了一个叫NameComparator的比较器类,但错误提示说Sortbyname找不到类型——这明显是类名不匹配:要么你在调用排序的时候写了new Sortbyname(),但实际类名叫NameComparator;要么你本来想把比较器类命名为Sortbyname,结果写的时候改成了NameComparator。另外你贴的NameComparator代码里publ...是拼写不全,应该是public,而且这个类还没正确实现Comparator<Player>的compare方法,这也是潜在问题。
完整的修正方案
我给你整理了可直接运行的完整代码,包含按姓名、分数排序的两种情况,你可以直接参考:
1. 先把Player类补全(加个toString方便看结果)
package javapractice2; public class Player { String player_name; int player_score; public Player(String member, int score) { this.player_name = member; this.player_score = score; } // 重写toString,打印的时候能直接看到球员信息 @Override public String toString() { return "球员:" + player_name + ",分数:" + player_score; } }
2. 写正确的姓名比较器(如果想用Sortbyname就改类名)
如果你就是想用Sortbyname作为类名,那直接把下面的类名改成Sortbyname就行,核心是要实现Comparator<Player>接口的compare方法:
package javapractice2; import java.util.Comparator; // 如果你要解决Sortbyname找不到的问题,就把类名改成Sortbyname public class NameComparator implements Comparator<Player> { @Override public int compare(Player p1, Player p2) { // 按姓名的字典序排序,想忽略大小写就用compareToIgnoreCase return p1.player_name.compareTo(p2.player_name); } }
3. 再写一个按分数排序的比较器
package javapractice2; import java.util.Comparator; public class ScoreComparator implements Comparator<Player> { @Override public int compare(Player p1, Player p2) { // 这里是降序排序,要是想升序就反过来写p1.player_score - p2.player_score return p2.player_score - p1.player_score; } }
4. 测试排序的主类
package javapractice2; import java.util.ArrayList; import java.util.Collections; public class PlayerSortTest { public static void main(String[] args) { // 创建几个球员实例 ArrayList<Player> players = new ArrayList<>(); players.add(new Player("Rohit", 85)); players.add(new Player("Virat", 120)); players.add(new Player("Dhoni", 90)); // 按姓名排序——注意这里用的比较器类名要和你定义的一致! Collections.sort(players, new NameComparator()); System.out.println("按姓名排序结果:"); for (Player p : players) { System.out.println(p); } // 按分数排序 Collections.sort(players, new ScoreComparator()); System.out.println("\n按分数排序结果:"); for (Player p : players) { System.out.println(p); } } }
最关键的几个注意点
- 类名必须一致:如果错误提示的是
Sortbyname找不到,那要么把比较器类名改成Sortbyname,要么把调用代码里的new Sortbyname()改成new NameComparator(),两边必须对应上! - 必须实现
compare方法:所有自定义比较器都要实现Comparator<T>接口的compare方法,不然编译肯定报错。 - 包结构要对:所有类都要放在
javapractice2包下,避免包导入的问题。
这样调整之后,你的排序代码就能正常跑起来啦!
内容的提问来源于stack exchange,提问作者karuppasamy
相关产品推荐
相关产品推荐

