Java - 如何使用CompareTo方法在小写字母之前命令大写字母

时间:2014-05-30 14:09:44

标签: java

让我们说,例如我有相同的 2个字符串,但第一个字符串以 大写字母和第二个字母不是。 现在,我需要使用CompareTo方法在小写字母之前输入大写字母。 我怎么做?因为CompareTo方法会以相反的方式对它们进行排序。

示例:列表= {"世界"," Aple","世界"," aple","您好& #34;} 我希望得到的顺序是:" Aple"," Hello"," World"," aple"," world&# 34 ;.意思是,无论如何,大写字母都是第一位的。

5 个答案:

答案 0 :(得分:3)

尝试

public class StringSorter {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("apple");
        list.add("Hello");
        list.add("Apple");
        list.add("World");
        list.add("hello");

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

                    @Override
                    public int compare(String o1, String o2) {
                        if(o1.equalsIgnoreCase(o2)){
                            return o1.compareTo(o2);
                        }
                        return o1.toUpperCase().compareTo(o2.toUpperCase());
                    }

                });

        System.out.println(list);

        // in a shorter way with java-8
        list.sort(Comparator.comparing(String::toLowerCase));
    }

}

答案 1 :(得分:1)

覆盖compareTo方法或实施Comparable Interface

文档说明返回值为

  根据表达式的值是负数,零还是正数,

-1,0或1。

因此,您只需要进行自己的字符串比较并返回适当的值。

答案 2 :(得分:0)

这是字符串比较的标准实现:

public int compareTo(String anotherString) {
    int len1 = value.length;
    int len2 = anotherString.value.length;
    int lim = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;

    int k = 0;
    while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    return len1 - len2;
}

您需要编写一个这样的方法来更改char值,例如:交换大写和小写。然后正如netinept所说的那样,在排序算法中使用它作为“比较”和“比较”。覆盖或&#39;可比较&#39;实施

答案 3 :(得分:0)

这样的事情应该有效 - 我正在修补回报,以便它可能会改变。

static class CasedStringComparator implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        if ( o1 == null ) {
            return -1;
        }
        if ( o2 == null ) {
            return 1;
        }
        for ( int i = 0; i < Math.min(o1.length(), o2.length()); i++ ) {
            char c1 = o1.charAt(i);
            char c2 = o2.charAt(i);
            if ( Character.isUpperCase(c1) && !Character.isUpperCase(c2)) {
                return -1;
            }
            if ( !Character.isUpperCase(c1) && Character.isUpperCase(c2)) {
                return 1;
            }
            int diff = Character.compare(c1, c2);
            if (diff != 0) {
                return diff;
            }
        }
        if ( o1.length() < o2.length() ) {
            return -1;
        }
        return 0;
    }
}

但正如@GriffeyDog指出的那样 - 这不会改变默认排序,它也会将大写字母置于小写之前。

答案 4 :(得分:0)

我喜欢Syam S的回答。想到以不同的方式尝试。 我相信它也相对有效率

关闭课程 - 添加空检查:)

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

        @Override
        public int compare(String o1, String o2) {
            int min = Math.min(o1.length(), o2.length());
            for (int k = 0; k < min ; k++ ){
                char c1 = o1.charAt(k);
                char c2 = o2.charAt(k);
                if (c1 != c2 ){
                    char u1 = Character.toUpperCase(c1);
                    char u2 = Character.toUpperCase(c2);
                    if (u1 == u2) {
                        return Character.isUpperCase(c1) ? -1 : 1;
                    }else{
                        return u1 - u2;
                    }
                }
            }

            return o1.length() - o2.length();
        }

    });