1. ホーム
  2. java

ソート後の配列のインデックスを取得する?

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.