我无法弄清楚可能是什么错误。这可能是一个愚蠢的。
问题:给定array
String
,删除重复项并提供按String
的长度排序的TreeSet。
这是我的实施:
public class MyPrograms {
public static void main(String[] args){
String[] arr = {"hello","world","a","b","cv","def","456","hello","world","b"};
System.out.println(Arrays.toString(arr));
sortStringbyLen(arr);
}
public static void sortStringbyLen(String[] arr){
Set<String> set = new TreeSet<String>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return Integer.compare(o2.length(), o1.length());
}
});
set.addAll(Arrays.asList(arr));
System.out.println(set);
}
}
}
输出结果为:
[hello, world, a, b, cv, def, 456, hello, world, b]
[hello, def, cv, a]
当我得到排序顺序正确时,我看到最后一组中缺少许多非重复元素(例如b, 456
)
答案 0 :(得分:2)
要获得正确的行为,您需要比较器输出与equals
方法一致。当两个字符串具有相同的长度时,比较器的输出为0,因此您只保留每个不同长度的一个元素。要修复它,你应该打破比较器中的联系,也许是这样:
new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int cmp = Integer.compare(o2.length(), o1.length());
return cmp != 0 ? cmp : o1.compareTo(o2);
}
}
答案 1 :(得分:1)
TreeMap
认为所有与0比较的元素相等(这实际上违反了Map
接口的约定)。因此,比较器的任何相同长度Strings
将返回0并被删除。您需要添加一个条件,如果字符串的长度相同,则应调用String的compareTo
方法。