Collections.sort似乎没有对我的ArrayLists进行排序,即使Comparator似乎被正确调用。看来,在对每个Arraylist执行排序后,排序不会粘连,ArrayLists中的项目保持其原始顺序。
这是我浏览每个Arraylist并对它们进行排序的方式,然后我打印它们来检查:
public void SortCreatures ( int x ) {
for ( Party p : SorcerersCave.theCave.parties ) {
//cycles through parties to sort each ones ArrayList members
switch ( x ) {
case 0 :
Collections.sort( p.members, new compareThings.CEmpathy());
case 1 :
Collections.sort( p.members, new compareThings.CFear() );
case 2 :
Collections.sort( p.members, new compareThings.CCarry() );
}
}
generateInterface.theGame.printOutput( "Displaying Sorted Creatures:" );
for ( Party p : SorcerersCave.theCave.parties ) {
generateInterface.theGame.printOutput( "" + p );
for ( Creature c : p.members ){
generateInterface.theGame.printOutput( "\t" + c );
}
}
}
这是使用案例0时的输出:(第5列中的第5个Int是Empathy):
Displaying Sorted Creatures:
10000 - School//Party for refference
20002 - Vampire - Loren - 10000 - 3 - 28 - 59
20003 - Leprechaun - Claretta - 10000 - 48 - 64 - 97
20000 - Witch - Catheryn - 10000 - 5 - 77 - 98
20001 - Kobold - Kim - 10000 - 60 - 42 - 208
10001 - Gaggle//Party for refference
20004 - Elf - Bob - 10001 - 51 - 51 - 155
20006 - Yeti - Soraya - 10001 - 28 - 30 - 209
20007 - Pixie - Dusty - 10001 - 8 - 74 - 242
20005 - Hero - Sol - 10001 - 90 - 24 - 273
10002 - Gang
...
这是移情的比较者:(第5列中的第5个Int是Empathy)
public static class CEmpathy implements Comparator< Creature > {
@Override
public int compare( Creature o1, Creature o2 ) {
int c1 = o1.getEmpathy();
int c2 = o2.getEmpathy();
System.out.println( c1 + " & " + c2 );
if ( c1 < c2 ) return -1;
else if ( c1 == c2 ) return 0;
else return 1;
}
}
让我感到困惑的是比较器似乎正确执行,这是打印出的每对数字。
60 & 5
3 & 60
3 & 60
3 & 5
48 & 5
48 & 60
90 & 51//new party
28 & 90
28 & 90
28 & 51
8 & 51
8 & 28
...
我已经在每个步骤打印了2个小时,但一切似乎都正常执行。任何帮助将不胜感激。
答案 0 :(得分:4)
不要忘记break
switch ( x ) {
case 0 :
Collections.sort( p.members, new compareThings.CEmpathy());
break; // IMPORTANT
case 1 :
Collections.sort( p.members, new compareThings.CFear());
break; // IMPORTANT
case 2 :
Collections.sort( p.members, new compareThings.CCarry());
break; // can be omitted here
}
因为switch
个案件落后,只要Collections.sort( p.members, new compareThings.CCarry());
为0,1或2,您的代码中的最后一个语句将始终为x
。
答案 1 :(得分:2)
通过jlordo评论和回答,问题是break
语句的每个case
末尾都没有使用switch
关键字。 IMO你可以在Map<Integer, Comparator< Creature >>
内移动所有这些逻辑,并将每个键映射到你想要/需要的相应比较器。我将发布一个基本的例子:
//sorry couldn't think of a better name for your class :)
public class ClassThatSortCreatures {
Map<Integer, Comparator<Creature>> mapComparators = new HashMap<Integer, Comparator<Creature>>();
public ClassThatSortCreatures() {
//initialize the map
mapCoparators.put(0, new compareThings.CEmpathy());
mapCoparators.put(1, new compareThings.CFear());
mapCoparators.put(2, new compareThings.CCarry());
}
public void SortCreatures ( int x ) {
for ( Party p : SorcerersCave.theCave.parties ) {
//avoiding usage of switch
Collections.sort( p.members, mapCoparators.get(x));
}
generateInterface.theGame.printOutput( "Displaying Sorted Creatures:" );
for ( Party p : SorcerersCave.theCave.parties ) {
generateInterface.theGame.printOutput( "" + p );
for ( Creature c : p.members ){
generateInterface.theGame.printOutput( "\t" + c );
}
}
}
}
您的代码看起来更清晰,更易于维护。另一个增强此方法的提示是,您可以使用int
代替使用enum
参数来避免验证地图中是否存在Comparator
。
答案 2 :(得分:0)
您的switch语句需要从
更改switch ( x ) {
case 0 :
Collections.sort( p.members, new compareThings.CEmpathy());
case 1 :
Collections.sort( p.members, new compareThings.CFear() );
case 2 :
Collections.sort( p.members, new compareThings.CCarry() );
}
到
switch ( x ) {
case 0 :
Collections.sort( p.members, new compareThings.CEmpathy());
break;
case 1 :
Collections.sort( p.members, new compareThings.CFear() );
break;
case 2 :
Collections.sort( p.members, new compareThings.CCarry() );
break;
}
如果没有break语句,也会执行正确语句下面的每一行。因此,如果x为2,则所有内容都将使用CCarry()进行排序。如果x为1,则所有内容都将使用CFear()和CCarry()进行排序。如果x为0,则数据按所有三个排序。