Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Collections.Sort意外地反转了;应为“排序输出”;_Java_Sorting_Collections - Fatal编程技术网

Java Collections.Sort意外地反转了;应为“排序输出”;

Java Collections.Sort意外地反转了;应为“排序输出”;,java,sorting,collections,Java,Sorting,Collections,我正在根据3个标准对ArrayList进行排序:类型-子类型-默认标志, 现在,除了在比较默认布尔标志时,当我在比较器上返回-1时,一切正常。compare方法的行为实际上类似于我返回的1,反之亦然 这是通缉令: if E and R : show E before R if A and R : show R before A if E and A if A is default show A before E else sh

我正在根据3个标准对
ArrayList
进行排序:类型-子类型-默认标志, 现在,除了在比较
默认布尔标志时,当我在
比较器上返回
-1
时,一切正常。compare
方法的行为实际上类似于我返回的
1
,反之亦然

这是通缉令:

if E and R : 
    show E before R
if A and R : 
    show R before A
if E and A
    if A is default
        show A before E
    else 
        show E before A
我有三种不同类型的卡:
E-R-A
R
E
的一种)

这是我的卡号:

public class Card {

    public enum Type {
        E("E-Type"),
        A("A-Type"),
        Other("Other");

        ....
    }

    private String cuid;
    private boolean isDefault;
    private String ref;
    private Type type;
    ............

    // getters and setters

    public Boolean isDefault() {
        return isDefault;
    }

    public void setDefault(boolean isDefault) {
        this.isDefault = isDefault;
    }
}
因此,我在这里填充列表:

private static void populateCards () {
    Card eCard  = new Card ();
    Card rCard  = new Card ();
    Card aCard  = new Card ();

    eCard.setCuid ("eCard");
    rCard.setCuid ("rCard");
    aCard.setCuid ("aCard");

    eCard.setType (Card.Type.E);
    rCard.setType (Card.Type.E);
    aCard.setType (Card.Type.A);

    rCard.setRef ("ref");

    aCard.setDefault (true);

    // failing sorting case only with these 2 
    cards.add (aCard);
    cards.add (eCard);
}
这是我的比较器代码:

Comparator<Card> comparator = new Comparator<Card> () {

    @Override
    public int compare (Card card1, Card card2) {

        if (cards.size () < 2) {
            return 0;
        }

        if (cards.size () == 2) {
            // E vs R
            if (card1.getType ().equals (card2.getType ())) {                       
                if (card1.getRef () == null) {
                    return -1;
                }
                return 1;
            }

            // if (R vs A) else (E vs A)
            if (card1.getRef != null || card2.getRef () != null) {
                return - card1.getType ().toString ().compareTo (card2.getType ().toString ());
            } else {
                if (card1.isDefault ()) {
                    // comes here successfully when card1 is Default
                    // ISSUE HERE it processes 1 as : show card2 before card1
                    return 1;
                } else if (card2.isDefault ()) {
                    // comes here successfully when card2 is Default
                    // ISSUE HERE it processes -1 as : show card1 before card2
                    return -1;
                } else {
                    return - card1.getType ().toString ().compareTo (card2.getType ().toString ());
                }
            }
        }

        ......................
    }
};

Collections.sort (cards, comparator);
为什么它将
1
-1
视为与它们应该是什么相反


谢谢。

您是否测试了比较器(单元测试)并检查它是否按照您希望的方式运行?@fge:这就是我正在做的,它在除最后两种情况外的每种情况下都会按照应该的方式运行。
if(cards.size()<2)
——这主意不好,完全没有必要
if(cards.size()<2)
——这是另一个坏主意,不确定您想要完成什么
......
--这可能就是问题所在,您省略了代码。
isDefault
的来源是什么?我认为你应该把
的源代码大体上展示出来。@Copernic你的代码非常复杂,值得尽量保持简单。对于只有两张卡的情况,您最好创建一个不同的
比较器
,而不是试图将不同的行为塞进一个
比较器
if (card1.isDefault ()) {
    // comes here successfully when card1 is Default
    // ISSUE HERE it processes 1 as : show card2 before card1
    return 1;
} else if (card2.isDefault ()) {
    // comes here successfully when card2 is Default
    // ISSUE HERE it processes -1 as : show card1 before card2
    return -1;
} else {
    return - card1.getType ().toString ().compareTo (card2.getType ().toString ());
}