首页 > 解决方案 > 自定义比较器java中的问题

问题描述

我目前正在用 Java 制作自然排序算法。并且要求是让它跑得快。给定一个输入字符串列表 [1!, 10!, 100, 100!, 2]。预期的输出顺序是 [1!, 2, 10!,100, 100!]。如您所见,他们首先对数字进行排序,然后比较值。但是,在设计案例时让我很头疼。

这是我在设计这个问题时的想法。

给定字符串ab.
(编辑:输入值可能是 100!90!10!1234,里面有多个“!”。抱歉之前没有提到。输入也会有英文字母。但当前版本可以像老板一样处理它)

我创建了四个索引(ind_a1, ind_a2, ind_b1, ind_b2)

情况1:如果是ind_a1或者ind_b1触摸!,则返回-1

情况 2:如果其中一个ind_a1ind_b1触摸字符串的末尾 - 1 返回-1(当前问题出现在情况 2 中)

案例3:当两个索引都触摸!时,

案例3.1:检查是否a.substring(ind_a2, ind_a1) == (b.substring(ind_b2, ind_b1) 相等意味着之前的值相同。例如: 1258!1001258!10a.substring(ind_a2, ind_a1) = (b.substring(ind_b2, ind_b1) = 1258

案例 3.2:如果它们不相等,那么它只返回之前的比较值。

这是我的完整代码。

public int compare(String a, String b) {
        int ind_a1 = 0 ,ind_a2 = 0;
        int ind_b1 = 0 ,ind_b2 = 0;
        int length_a = a.length();
        int length_b = b.length();
        int result = a.compareTo(b);
        char char_a, char_b;


        while(true)
        {
            char_a = a.charAt(ind_a1);
            char_b = b.charAt(ind_b1);
            //check if a or b is an empty String
            if(length_a == 0 || length_b ==0) {
                return length_a - length_b;
            }

            //Case 1)
            if(char_a == '!' && char_b != '!') {
                return -1;
            }
            if(char_b == '!' && char_a != '!') {
                return +1;
            }
            //Case 2: I NEED HELP HERE
            if(ind_a1 == length_a-1 || ind_b1 == length_b-1 ) {
                return length_a - length_b;
            }

            //Case 2 corner case, if both string has same length
            if(length_a == length_b) {
                return result;
            }

            //Case 3, if both index touch "!"   
            if(char_a =='!' && char_b == '!' ) {
                //Case 3.1
                if(a.substring(ind_a2, ind_a1) == (b.substring(ind_b2, ind_b1))) {
                    ind_a2 = ind_a1;
                    ind_b2 = ind_b1;
                }
                //Case 3.2
                else {
                    return a.substring(ind_a2,ind_a1).compareTo(b.substring(ind_b2,ind_b1));
                }                       
            }       
            ind_a1++;
            ind_b1++;
        }


    }

}

当前的输出顺序是 [2, 1!, 10!, 100, 100!]。我知道它不起作用,因为 2 的索引比 1 少!所以它会返回-1。但是,无论如何调整代码(或使其更好,我将不胜感激)以使其工作?

(例如,给定 [A5,a5,A5!,a5!,!A,!a,A,a,1,!] 的输入

输出应该是 [!, !A, !a, 1, A, a, A5, A5!, a5! ])

标签: javaalgorithmsorting

解决方案


public static void main(String... S) {
    List a = Arrays.asList("1!", "10!", "100!", "100", "2");
    Collections.sort(a, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            int oo1 = 0;
            int oo2 = 0;

            if (o1.contains("!")) {
                oo1 = 1;
                o1 = o1.replace("!", "");
            }

            if (o2.contains("!")) {
                oo2 = 1;
                o2 = o2.replace("!", "");
            }

            int result = (Integer.valueOf(o1) - Integer.valueOf(o2));

            return result == 0 ? oo1 - oo2 : result;
        }
    });
    System.out.println(a);

}

根据评论

@Psingh 我们不必处理“!!!!!!” 设想。期望值应该是 [2, A, 1!, 10!, 100, 100! ]

public static void main(String... S) {
    List a = Arrays.asList("1!", "1!!", "10!", "100!", "100", "2", "A");
    Collections.sort(a, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            int ooo1 = 0;
            int ooo2 = 0;

            for (char i : o1.toCharArray()) {
                ooo1 += (int) i;
            }
            for (char i : o2.toCharArray()) {
                ooo2 += (int) i;
            }
            return ooo1 - ooo2;
        }
    });
    System.out.println(a);
}

推荐阅读