0

我是一名 Java 新手,在覆盖 Comparable 接口中的 compareTo 方法时遇到了一些麻烦。我的代码创建了一个将字符串与 int 相关联的 HashMap。我想覆盖 compareTo 以便 ArrayList 键中的字符串根据它们的 HashMap 值排序,而不是按字母顺序排序。但是,在此实现下,字符串仍按字母顺序排序。

哦,澄清一下,nameWeight 是 String,Integer 对的 HashMap。

有任何想法吗?

List<String> keys = new ArrayList<String>(nameWeight.keySet());
System.out.println(keys);
Collections.sort(keys);


public int compareTo(String that){
    int gtr = 1;
    int less = -1;
    int eql = 0;
    System.out.print(this);
    System.out.print(that);
    if(that=="JOHN")
        return less;
    int valThis = nameWeight.get(this);
    int valThat = nameWeight.get(that);
    if(valThis==valThat)
        return eql;
    if(valThis>valThat)
        return gtr;
    if(valThis<valThat)
        return less;
    return gtr;


}
4

1 回答 1

0

您正在对字符串列表进行排序,因此compareTo调用的方法是在类String(或其超类)中定义的方法。由于您无法修改String,因此您必须创建 String 的子类,compareTo在该类中覆盖并使用List<StringSubClass>. 但是因为Stringfinal不允许你继承它的子类(感谢@pst)。

或者,您不使用String列表中的对象,而是使用您创建和覆盖的类型的对象compareTo(不要忘记添加implements Comparable到类定义中)。

或者(再次来自@pst 的无耻插件),这可能是最好的解决方案,您将比较器传递给sort将用于对字符串进行排序而不是默认实现的函数。

于 2013-02-09T22:41:18.777 回答