如何正确排序包含字符串和数字的ArrayList <string>?</string>

时间:2014-06-20 14:30:48

标签: java android sorting arraylist

我目前正在尝试根据&#34;项目&#34;之后找到的数字订购ArrayListString元素(称为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不合适,因为它显示的是&#34; 10&#34;通过它的第一个数字&#34; 1&#34;。有谁知道如何以反向数字顺序正确地命令myarraylist

5 个答案:

答案 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());