Java Collections.Sort意外地反转了;应为“排序输出”;
我正在根据3个标准对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
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 ());
}