Java TreeSet未使用自定义比较器正确排序

Java TreeSet未使用自定义比较器正确排序,java,Java,我有一个定制的树集: TreeSet<String> sortedOptionSet = new TreeSet<String> (new Comparator<String>() { @Override public int compare(String arg1, String arg2) { if (arg1 == null || arg2 == null) {

我有一个定制的树集:

    TreeSet<String> sortedOptionSet = new TreeSet<String> (new Comparator<String>() {

        @Override
        public int compare(String arg1, String arg2) {
            if (arg1 == null || arg2 == null) {
                return -1;
            }

            String o1 = arg1, o2 = arg2;
            String k1 = "1", k2 = "2";

            try{
                if (o1.contains("P1")) {
                    return -1;
                }
                else if (o2.contains("P1")) {
                    return 1;
                }
                else if (o1.contains("P2")) {
                    return -1;
                }
                else if (o2.contains("P2")) {
                    return 1;
                }
            } catch (Exception e) {}


            //If there is no rule for this combination, order them using key number ascending
            int result = 1;
            try {
                Integer key1 = Integer.valueOf(k1);
                Integer key2 = Integer.valueOf(k2);
                result = key1.compareTo(key2);
                if (result == 0) {
                    result = 1;
                }
            } catch (Exception e) {
            }
            return result;

        }
    });

    sortedOptionSet.add("TEST1");
    sortedOptionSet.add("P1");
    sortedOptionSet.add("TEST2");
    sortedOptionSet.add("P2");
    sortedOptionSet.add("TEST3");

    ArrayList<String> result = new ArrayList<String>();
    result.addAll(sortedOptionSet);

    for (String s : result) {
        System.out.println(s);
    }
但结果还是回来了

P2
P1
TEST1
TEST2
TEST3

我想不出为什么会有这种行为。请帮助。

您的比较方违反了合同的许多规则。特别是,比较器应该是一致的:

A > B iff B < A
A = B iff B = A
A > B and B > C ==> A > C
A>B如果BB和B>C==>A>C
事实并非如此。例如,如果A和B都为空,
compare(A,B)
将导致Acompare(B,A)将导致B 如果A和B都包含P1或P2,则相同


如果它们具有相同的整数键,
compare(A,B)
将导致A>B,
compare(B,A)
将导致B>A。除此之外,您甚至不会比较比较器的参数,而是比较两个硬编码值k1和k2。如果在解析任何一个数字时出现异常,第一个总是最大的。

您的比较器违反了合同的许多规则。特别是,比较器应该是一致的:

A > B iff B < A
A = B iff B = A
A > B and B > C ==> A > C
A>B如果BB和B>C==>A>C
事实并非如此。例如,如果A和B都为空,
compare(A,B)
将导致Acompare(B,A)将导致B 如果A和B都包含P1或P2,则相同


如果它们具有相同的整数键,
compare(A,B)
将导致A>B,
compare(B,A)
将导致B>A。除此之外,您甚至不会比较比较器的参数,而是比较两个硬编码值k1和k2。如果在解析任何数字时出现异常,则第一个总是最大的。

是否尝试附加调试器并单步执行对比较方法的调用?是否尝试附加调试器并单步执行对比较方法的调用?