需要帮助覆盖compareTo

时间:2013-02-09 22:34:45

标签: sorting interface comparable compareto

我是一个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;


}

1 个答案:

答案 0 :(得分:0)

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

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

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