具有整数值的字符串的排序列表-Java

时间:2013-06-26 09:40:48

标签: java java-ee sorting collections comparator

我有这个字符串列表

Car1

Car2

Car3

......


Carn

我想根据其中的数字对此列表进行排序 例如,如果我有Car3, Car1, Car12, Car45, 我希望它像Car1, Car3, Car12, Car45一样排序 我使用过Collections.sort(),但它会返回Car1, car12, car3, Car45之类的内容 我该怎么做才能把它按正确顺序排列?

9 个答案:

答案 0 :(得分:5)

你需要一个自定义比较器,比如

    Collections.sort(list, new Comparator<String>() {
        public int compare(String s1, String s2) {
            int i1 = Integer.parseInt(s1.replaceAll("\\D", ""));
            int i2 = Integer.parseInt(s2.replaceAll("\\D", ""));
            return Integer.compare(i1, i2);
        }
    });

答案 1 :(得分:4)

使用此:

class ComparatorOfNumericString implements Comparator<String>{

    public int compare(String string1, String string2) {
        // TODO Auto-generated method stub
        String a = string1.substring(3);
        String b = string2.split(3);
        return Integer.parseInt(a)-Integer.parseInt(b);
    }
}

现在当排序通过这个比较器时如下:

Collections.sort(stringList,new ComparatorOfNumericString ());

答案 2 :(得分:3)

排序是字典式的,你得到这个顺序,因为字母表中的1小于3,比较器忽略了接下来的内容。 您需要做的是编写自己的比较器,这将切断“Car”只留下字符串中的数字,然后您需要将该数字的字符串表示形式解析为int并比较整数(作为其中一个解决方案)

答案 3 :(得分:3)

您需要为Comparator<String>方法指定自定义Collections.sort(),以定义字符串所需的顺序。

这适用于字符串中任何位置的数字,并且还处理没有数字的字符串(回退到与自然排序的普通字符串比较):

final Pattern intsOnly = Pattern.compile("\\d+");

Comparator<String> comparator = new Comparator<String>() {
    @Override
    public int compare(final String string1, final String string2) {
        String int1 = null;
        String int2 = null;
        Matcher matcher1 = intsOnly.matcher(string1);
        if (matcher1.find()) {
            int1 = matcher1.group();
            Matcher matcher2 = intsOnly.matcher(string2);
            if (matcher2.find()) {
                int2 = matcher2.group();
            }
        }
        if (int1 == null || int2 == null) { return string1.compareTo(string2); }
        return Integer.valueOf(int1).compareTo(Integer.valueOf(int2));
    }
};
Collections.sort(strings, comparator);

当然这意味着Truck1将在Car2之前出现,但根据您的问题,这就是您想要的。

更新: 上述解决方案无法确保Car6将在Truck6之前到来。如果您还希望在数字相同的情况下回退到自然字符串排序,请使用:

final Pattern intsOnly = Pattern.compile("\\d+");

Comparator<String> comparator = new Comparator<String>() {
    @Override
    public int compare(final String string1, final String string2) {
        String int1 = null;
        String int2 = null;
        Matcher matcher1 = intsOnly.matcher(string1);
        if (matcher1.find()) {
            int1 = matcher1.group();
            Matcher matcher2 = intsOnly.matcher(string2);
            if (matcher2.find()) {
                int2 = matcher2.group();
            }
        }
        int result = 0;
        if (int1 != null && int2 != null) {
            result = Integer.valueOf(int1).compareTo(Integer.valueOf(int2));
        }
        if (result == 0) {
            return string1.compareTo(string2);
        }
        else {
            return result;
        }
    }
};
Collections.sort(strings, comparator);

答案 4 :(得分:1)

您需要创建一个自定义Comparator,按您的需要进行排序。然后你可以打电话

Collections.sort(myList, myComparator)

请参阅Collections.sort(List, Comparator)

您可以在此处阅读比较器:Implementing Java Comparator

答案 5 :(得分:1)

您需要使用比较器重载sort。以下代码适用于您的特定字符串(CarXXX):

Collections.sort(carList, new Comparator<String>() {
    public int compare(String s1, String s2) {
        int t1 = Integer.parseInt(s1.substring(3));
        int t2 = Integer.parseInt(s2.substring(3));
        return t1 - t2;
    }
});

答案 6 :(得分:1)

Collections.sort()是正确的,只需要写比较器:

public class testComp implements Comparator<String> {

@Override
public int compare(String o1, String o2) {
    int number1 = Integer.parseInt(o1.substring(3, o1.length()));
    int number2 = Integer.parseInt(o2.substring(3, o2.length()));
    if (number1 > number2) {
        return -1;
    } else {
        return 1;
    }
}

答案 7 :(得分:0)

Car1是对象,因此您必须为此创建自定义Comparator。并指定它的排序性质。

Collection.Sort()将指定列表按升序排序,根据其元素的自然顺序排序。只是示例:字符串将像a-z一样,数字是0-9。但是对象没有任何自然顺序。

答案 8 :(得分:0)

这对你有用。但你不能重复

    String text = "Car3, Car1, Car12, Car45";
    String[] str = text.split(", ");
    Map<Integer,String> myMap=new HashMap<>();
    int[] numOnly=new int[str.length];
    for (int i = 0; i < str.length; i++) {
          numOnly[i] = Integer.parseInt(str[i].replaceAll("\\D", ""));
          myMap.put(numOnly[i],str[i]);
    }       
    System.out.println(myMap.values());