You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:51:20