1

Comparator が適切に呼び出されているように見えても、Collections.sort は ArrayLists をソートしていないようです。各 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;
    }
}

私を混乱させているのは、Comparator が適切に実行されているように見えることです。これは、比較される数値の各ペアの出力です。

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 時間印刷しましたが、すべてが適切に実行されているようです。どんな助けでも大歓迎です。

4

3 に答える 3

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ケースは失敗するため、コードでは最後のステートメントは常に0、1、または 2 のいずれかにCollections.sort( p.members, new compareThings.CCarry());なります。x

于 2013-06-27T17:24:38.923 に答える
0

あなたのスイッチステートメントはから変更する必要があります

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 の場合、データは 3 つすべてでソートされます。

于 2013-06-27T17:24:52.213 に答える