Javaは:indexOfメソッドを持つ別の配列に基づいて配列をソートします

chakwok:

私は、この場合10である別の配列(インデックス)、34、32、21のソート順に基づいて、2つのアレイ(A、B)を反復したいです。

String[] A: a, b, c, d
String[] B: e, f, g, h
int[] indexes: 10, 34, 32, 21

ここでは、悪い例についてのお詫び。私は混乱をクリアするために、インデックス配列を更新しました。

予想される入力と出力

入力は、3つの配列です。私は、インデックス列の並べ替えを使用してA、Bを反復処理したかったです。すなわち、私は(E、H、G、F)順序を使用して注文(D、C、B)及び反復Bを使用して反復Aへの道を見つけたいと思います

私のアプローチ:

私は、私は別のアプローチと同じであると考えている解決策の問題を解決しました。しかし、第二のアプローチはしません動作します。私はそれが私にCollections.sortはJavaでどのように動作するかの理解を与えるだろうと思うと、それは仕事をしない理由誰かが説明できる場合、私は幸いです。

List<Integer> indexOrder = new ArrayList<>(indexes.length);

for (int i = 0; i < indexes.length; i++) {
    indexOrder.add(i);
}

Collections.sort(indexOrder, Comparator.comparing((Integer s) -> indexes[s]));

触発され、このスレッド、I値(1、2、3 ... indexes.length)、次いでソートそれはREFとコンパレータを用いてのArrayListを(連想リストではない配列を好む)が作成しました。インデックスへ。期待通りの仕事上のコード。

しかし、私が変更された場合、インデックスを[S]の最後の行の末尾のインデックス[indexOrder.indexOf(S)]ソートは、間違った結果が得られます。ArrayListののインデックスは、その値と同じであれば、なぜのindexOf(複数可)■とは異なる結果を与えています。

Collections.sort(indexOrder, Comparator.comparing((Integer s) -> indexes[indexOrder.indexOf(s)]));
彼らは次のとおりでした:

あなたが期待するようでindexOrder.indexOf(s)いつもと同じになるようにs(あなたがいるためListに初期化された[0, 1, 2, 3]の指数はどこ、sですs)。

これはあなたの元には事実ですがindexOrder List、これはもはや真のかもしれときCollections.sort開始はあなたの要素を交換しませんList

順序に依存しないためにindexOrderあなたがそれをソートしている間、あなたはそのコピーを作成することができますList

List<Integer> copy = new ArrayList<>(indexOrder);
Collections.sort(indexOrder, Comparator.comparing((Integer s) -> indexes[copy.indexOf(s)]));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=137571&siteId=1