我是一个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;
}
答案 0 :(得分:0)
您正在对字符串列表进行排序,因此调用的compareTo
方法是在类String
(或其超类)中定义的方法。由于您无法修改String
,因此必须创建String的子类,在该类中覆盖compareTo
并使用List<StringSubClass>
。但由于String
为final
,因此不允许从中进行子类化(感谢@pst)。
或者,您不要在列表中使用String
个对象,而是使用您创建的类型的对象以及覆盖compareTo
的对象(不要忘记在课程中添加implements Comparable
定义)。
或者(来自@pst的无耻插件),这可能是最好的解决方案,你将比较器传递给sort
函数,该函数将用于对字符串进行排序而不是默认实现。