包含整数的字符串的Java Comparator

时间:2013-03-27 04:56:53

标签: java string integer comparator

我正在尝试编写一个Comparator,用于根据字符串列表对字符串列表进行排序。 恩。 H3232GHSD3和H56RFRSFR4,第一个字符串有整数32323,而第二个字符串有整数564,因此第二个字符串小于第一个字符串。

继承我的代码

import java.util.*;

// Sorts strings based on integers it contains 
class IntComparator implements Comparator<String>{

    @Override
    public int compare(String s1, String s2) {
        // Strip the non integers from strings
        s1 = s1.replaceAll("[^\\d.]","");
        s1 = s1.replaceAll("[^\\d.]","");
        // change string to integers
        int l1 = Integer.parseInt(s1);
        int l2 = Integer.parseInt(s2);

        if(l1 > l2){
            return 1;
        }
        else if(l1 < l2){
            return -1;
        }
        return 0;
    }
}
public class sample {
    public static void main(String[] args) {

        List<String> RandomString = new ArrayList<String>();

        RandomString.add("HA4ZNV0WE1");
        RandomString.add("A3XHN20WE1");
        RandomString.add("D4VH3V0WE1");

        Collections.sort(RandomString, new IntComparator());

        for(String R : RandomString){
            System.out.println(R);
        }

    }

}

这是我得到的错误

Exception in thread "main" java.lang.NumberFormatException: For input string: "HA4ZNV0WE1"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at IntComparator.compare(sample.java:13)
    at IntComparator.compare(sample.java:1)
    at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at java.util.Collections.sort(Unknown Source)
    at sample.main(sample.java:36)

谢谢,

4 个答案:

答案 0 :(得分:3)

您的代码中有拼写错误。改变 -

// Strip the non integers from strings
s1 = s1.replaceAll("[^\\d.]","");
s1 = s1.replaceAll("[^\\d.]","");

到此 -

// Strip the non integers from strings
s1 = s1.replaceAll("[^\\d.]","");
s2 = s2.replaceAll("[^\\d.]",""); // In your code, you've written s1 here too.

我假设您已复制并粘贴了第一行,并忘记更改变量名称。这就是为什么有时它被称为anti-pattern

答案 1 :(得分:2)

注意你的代码

// Strip the non integers from strings
s1 = s1.replaceAll("[^\\d.]","");
s1 = s1.replaceAll("[^\\d.]","");

你应该把第二行变成

s2 = s2.replaceAll("[^\\d.]","");

在您发布的代码中,您只是删除了s1中的非数字两次,并且永远不会让s2指向只有数字的字符串。

答案 2 :(得分:0)

尝试[^\p{L}]而不是你的正则表达式

答案 3 :(得分:0)

        s1 = s1.replaceAll("\\D", "");
        s2 = s2.replaceAll("\\D", "");