2

入力ファイルに基づいてチェーンを構築するために使用している整数のリストのリストがあります。入力はペアを指定し (例: "3, 1" は、アプリケーションで 1 が 3 を置き換えることを示します)、ペアには重複があります (例: "3, 1" と "1, 4" は、1 が 3 を置き換え、4 が 4 を置き換えることを意味します)。 1 であるため、最終的には 4 が 3 に置き換わります)。

すべてのペアを最終的なチェーンに縮小するために、すべてのペアのリストを含むリストを作成し、リスト内の重複するエントリを見つけて、必要に応じてチェーンに追加し、追加されたペアを削除します。別。これは私がこれをやろうとしている方法ですが、失敗はイテレータ参照を2倍にすることにあることを知っています:

    for (ArrayList<Integer> outerChain : chains) {
        for (ArrayList<Integer> innerChain : chains) {
            if (outerChain.get(0).equals(innerChain.get(innerChain.size() - 1))) {
                outerChain.remove(0);
                innerChain.addAll(outerChain);
                chains.remove(outerChain);
                break;
            }
        }
    }

この操作からの入力/目的の出力の例として:

    {<1,3>,<2,7>,<7,9>,<8,12>,<9,1>,<6,8>}

入力ペアに対応する個々のリストである場合、出力は次のようになります。

    {<2,7,9,1,3>,<6,8,12>}

このようなイテレータをネストして、どちらかを削除または更新するときに各イテレータ内の参照が更新されるようにする方法はありますか?

助けてくれてありがとう!

4

4 に答える 4

1

二重の for-each-loop には問題はありませんが、オブジェクト==の比較に使用している演算子には大きな問題がありIntegerます。これは完全に間違っています。.equals()代わりにメソッドを使用する必要があります。

于 2013-04-29T19:38:40.777 に答える
1

イテレータでリストを変更すると、そのイテレータは使用できなくなります。幸いなことに、とにかく最初からやり直す必要があるので、自然な解決策があります

OUTER: while(chains.size() > 1) {
    for (ArrayList<Integer> outerChain : chains) {
            for (ArrayList<Integer> innerChain : chains) {
                if (outerChain.get(0) == innerChain.get(innerChain.size() - 1)) {
                    outerChain.remove(0);
                    innerChain.addAll(outerChain);
                    chains.remove(outerChain);
                    continue OUTER;
                }
            }
        }
    break; // no more matches found.
}
于 2013-04-29T19:37:14.520 に答える
-1

これをガイドとして使用してください:

    for(int[] i: sampleIntArray)
    {
        for(int current: i)
        {
            //sample code here;
        }
    }
于 2016-01-05T14:55:10.123 に答える