我有这个:
Comparator<Item> ignoreLeadingThe = new Comparator<Item>() {
public int compare(Item a, Item b) {
String newA = a.name.replaceAll("(?i)^the\\s+", "");
String newB = b.name.replaceAll("(?i)^the\\s+", "");
return newA.compareToIgnoreCase(newB);
}
};
Array.sort(MyItemArrayOfObjects, ignoreLeadingThe);
我停止使用Arrays,现在正在使用ArrayList。所以当我这样做时:
Collections.sort(MyItemArrayListOfObjects, ignoreLeadingThe);
我甚至无法弄清楚它现在正在排序的模式。我可以像这样做一个干净的开关吗? (我完全有可能用上面没有提到的东西打破这个,如果这是正确的话,那就是我需要知道的全部)
注意:最初,使用数组我只是试图按字母顺序排列并忽略前导“The”。这是一个Android应用程序。每个List行的Item数据都包装在一个Object中,我将它传递给ArrayAdapter。我只是想在该对象中取一个ArrayList并按字母顺序排列。基本上,它是一个ArrayList,里面有一些ArrayList。
答案 0 :(得分:1)
您的比较器看起来不错
坏消息是它不会缓存生成的字符串。因此,您的排序将创建o(N*log(N))
模式,匹配器和字符串的对象,而不是谈论创建其中一些不是超快的事实。
<强> UPD 强>
建议在你为接口实现的方法和子类中的覆盖时使用@Override。
答案 1 :(得分:1)
它对Collections.sort非常有效,我只建议改进比较器
Comparator<Item> ignoreLeadingThe = new Comparator<Item>() {
Pattern pattern = Pattern.compile("(?i)^the\\s+");
public int compare(Item a, Item b) {
String newA = pattern.matcher(a.name).replaceAll("");
String newB = pattern.matcher(b.name).replaceAll("");
return newA.compareToIgnoreCase(newB);
}
};