我目前正在尝试根据"项目"之后找到的数字订购ArrayList
个String
元素(称为myarraylist
)。以下是myarraylist
:
Item 1
Item 2
Item 3
...
Item 9
Item 10
我想按以下顺序订购myarraylist
:
Item 10
Item 9
Item 8
...
Item 3
Item 2
Item 1
到目前为止,这是我尝试过的:
Collections.sort(myarraylist, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(myarraylist);
但是,这会按以下顺序命令myarraylist
Item 9
Item 8
...
Item 3
Item 2
Item 10
Item 1
正如您所看到的,Item 10
不合适,因为它显示的是" 10"通过它的第一个数字" 1"。有谁知道如何以反向数字顺序正确地命令myarraylist
?
答案 0 :(得分:1)
这是因为默认字符串Comparator
使用lexicographical order - 即字符逐个字符。由于“1”位于“2”之前,因此任何以“1”开头的字符串将以“2”开头的任何其他字符串开头。
您应该使用自定义比较器来实现Natural Sorting。一个很好的例子是来自Dave Koelle的Alphanum,你可以这样使用:
Collections.sort(myarraylist, new AlphanumComparator());
答案 1 :(得分:1)
我使用这个简单的类来命令我的Strings
:
public abstract class StringOrderer {
public static ArrayList<String> order(ArrayList<String> items, boolean ascending) {
Collections.sort(items, new StringComparator());
// reverse the order
if(!ascending) Collections.reverse(items);
return items;
}
class StringComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
// use the users default locale to sort the strings
Collator c = Collator.getInstance(Locale.getDefault());
return c.compare(s1, s2);
}
}
}
基本的想法是我有一个使用默认Comparator
的自定义 Locale
。
答案 2 :(得分:0)
由于您在Array列表中使用String,因此它总是检查字符。最好尝试使用Integer。它可能适合你。
答案 3 :(得分:0)
由于无法扩展字符串,因此最好将ArrayList<String>
更改为ArrayList<ClassWithStringAttribute>
,然后在需要自定义比较时在ClassWithStringAttribute
中实现Comparable。对于您的特定情况和插图,以下类应该工作,但不是一个很好的方法。
myarraylist= StringSorter.getSortedList(myarraylist);
会给你一个排序列表
public class StringSorter implements Comparable<StringSorter>{
String tempString;
public StringSorter(String data) {
this.tempString = data;
}
public static List<String> getSortedList(List<String> unsortedList){
List<StringSorter> tempList=new ArrayList<StringSorter>();
for (String current : unsortedList) {
tempList.add(new StringSorter(current));
}
Collections.sort(tempList);
List<String> sortedString=new ArrayList<String>();
for (StringSorter current : tempList) {
sortedString.add(current.tempString);
}
return sortedString;
}
@Override
public int compareTo(StringSorter other) {
Integer otherInt=Integer.parseInt(other.tempString.replaceFirst("Item ", ""));
Integer thisInt=Integer.parseInt(this.tempString.replaceFirst("Item ", ""));
if(otherInt>thisInt){
return -1;
}else if(otherInt<thisInt){
return 1;
}else{
return 0;
}
}
}
答案 4 :(得分:-1)
此自定义Comparator
,
public class StringNumSuffixComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
String str1 = o1;
String str2 = o2;
Integer num1 = Integer.parseInt(str1.replaceAll("\\D+",""));
Integer num2 = Integer.parseInt(str2.replaceAll("\\D+",""));
return num2.compareTo(num1);
}
}
使用Collections.sort()
,
Collections.sort(items, new StringNumSuffixComparator());