ソート後の配列のインデックスを取得する?
2023-08-30 07:56:15
質問
ユーザーが、例えば、配列を入力したとします。
Array = {France, Spain, France, France, Italy, Spain, Spain, Italy}
の長さは知っていたのですが
その
index
の配列になります。
index = {0, 1, 2, 3, 4, 5, 6, 7}
でソートした後
Arrays.sort(Array);
newArray
のようになります。
newArray = {France, France, France, Italy, Italy, Spain, Spain, Spain}
で、その
newIndex
になります。
newIndex = {0, 2, 3, 4, 7, 1, 5, 6}
問題は、どのようにすれば
newIndex
を見つけることができるかということです。
事前にありがとうございます
どのように解決するのですか?
そもそも配列のソートをしない。インデックス配列をソートし、値を比較するコンパレータを渡して、それらを使って
として
として値を比較するコンパレータを渡して、配列のインデックスを並べ替えます。つまり、最終的に
newIndex
になり、そこから実際のアイテムのソートされた配列に行くのは簡単なことです。
確かに、これはカスタムの方法で整数の配列をソートすることを意味します。
Integer[]
と標準のJavaライブラリを使うか、サードパーティのライブラリで"IntComparator"インターフェイスを持っていて
sort(int[], IntComparator)
タイプのメソッドと組み合わせて使用することができます。
EDIT: さて、ここにコンパレータの例があります。単純化するために、私はあなたが文字列の配列の "オリジナル" をソートしたいだけだと仮定します... そして私はヌリティ・テストに悩まされることはありません。
public class ArrayIndexComparator implements Comparator<Integer>
{
private final String[] array;
public ArrayIndexComparator(String[] array)
{
this.array = array;
}
public Integer[] createIndexArray()
{
Integer[] indexes = new Integer[array.length];
for (int i = 0; i < array.length; i++)
{
indexes[i] = i; // Autoboxing
}
return indexes;
}
@Override
public int compare(Integer index1, Integer index2)
{
// Autounbox from Integer to int to use as array indexes
return array[index1].compareTo(array[index2]);
}
}
こんな風に使うんですね。
String[] countries = { "France", "Spain", ... };
ArrayIndexComparator comparator = new ArrayIndexComparator(countries);
Integer[] indexes = comparator.createIndexArray();
Arrays.sort(indexes, comparator);
// Now the indexes are in appropriate order.
関連
-
Java の switch case 文で必要な定数式の問題の解決法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
型に解決できない エラー解決
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
SocketException java.netの4つの例外解決策。
-
セミコロン期待値エラー解決
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
Java の double データ型における 0.0 と -0.0 の問題
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。