通过忽略beginnig中的 - 字符(如果存在)对arraylist进行排序

时间:2016-10-28 10:36:01

标签: java sorting arraylist

我想对包含许多行的arraylist进行排序

我想忽略' - '

如果是该行的第一个字母

INPUT

-bbb

一个-AAA

滴滴滴

B-DDD

C-CCC

输出

应该是(你可以看到它应该按照第一个字符排序(a b c d)

一个-AAA

-bbb

C-CCC

滴滴滴

E-EEE

这是我的代码

Collections.sort(arrList, new Comparator<String>() {

@Override
public int compare(String o1, String o2) {
    if (o1.startsWith("-") && o2.startsWith("-")) {
        return compare(o1.substring(1), o2.substring(1));
    }

    if (o1.startsWith("-")) {
        return 1;
    }
    if (o2.startsWith("-")) {
        return -1;
    }

    return o1.compareTo(o2);
}

});

4 个答案:

答案 0 :(得分:3)

您在比较器中使用|而不是-

您的比较不正确,如果o2o1开头,则您无法忽略-

if (o1.startsWith("-")) {
    return 1;
}

这会忽略很多结果......

要正确比较,您必须遵循此行为:如果String-开头,则获取第二个字符(位置1),否则取第一个字符(位置0) 。只要您不能compareTo原始类型,单个字符的substring将更有用。

分别对每个字符串执行此操作,并compareTo结果。

知道这一点你可以实现你的比较器(还有其他简化和oneliners答案,但为了OP可以更好地理解我将是基本的):

Collections.sort(arrList, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {
        String s1 = "", s2 = "";

        // check first string and choose 
        //candidate character to compare
        if (o1.startsWith("-")) 
            s1 = o1.substring(1);
        else 
            s1 = o1.substring(0);

        // check second string and choose 
        // candidate character to compare
        if (o2.startsWith("-")) 
            s2 = o2.substring(1);
        else 
            s2 = o2.substring(0);

        // compare both choosen characters        
        return s1.compareTo(s2);
    }
});

主要用于测试:

List<String> list = new ArrayList<>();
list.add("-bbb");
list.add("a-aaa");
list.add("-ddd");
list.add("b-ddd");
list.add("c-ccc");

<强>输出:

a-aaa
b-ddd
-bbb
c-ccc
-ddd

答案 1 :(得分:1)

老实说,没有必要做那么多工作。只需在使用正则表达式时比较两个值。你最初遇到的问题是,当你从-开始时,你从来没有忽略它们,如果它以-

开头,你只是比另一个更大的lexograhhpicly
public static void main(String[] args) {
    List<String> testList = new ArrayList<>();
    testList.add("-bbb");
    testList.add("a-aaa");
    testList.add("-ddd");
    testList.add("b-ddd");
    testList.add("c-ccc");
    Collections.sort(testList, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            // This removes leading - from the input and ignores them
            // At the moment it removes one ore more -, if it should just be one
            // remove the +
            return o1.replaceAll("^-+", "").compareTo(o2.replaceAll("^-+", ""));
        }
    });
    for(String s : testList) {
        System.out.println(s);
    }
}

O / P

a-aaa
b-ddd
-bbb
c-ccc
-ddd

答案 2 :(得分:0)

double

或更短但不太可读

final String o1s;
final String o2s;

if (o1.startsWith("|")) {
    o1s = o1.substring(1);
} else {
    o1s = o1;
}

if (o2.startsWith("|")) {
    o2s = o2.substring(1);
} else {
    o2s = o2;
}

return o1s.compareTo(o2s);

答案 3 :(得分:0)

以下是您的要求的逻辑

public int compare(String str1, String str2) {
        if(str1.startsWith("-")){
            if(str2.startsWith("-")){
                str1 = str1.substring(1);
                str2 = str2.substring(1);

                return str1.compareTo(str2);
            }else{
                str1 = str1.substring(1);
                return str1.compareTo(str2);
            }
        } else if(str2.startsWith("-")){
            if(str1.startsWith("-")){
                str1 = str1.substring(1);
                str2 = str2.substring(1);

                return str1.compareTo(str2);
            }else{
                str2 = str2.substring(1);
                return str1.compareTo(str2);
            }
        }else{
            return str1.compareTo(str2);
        }
    }