10

私はJavaで倍精度の配列を持っています:arr1私はソートしたいです。おそらく最初のオプションはユーティリティメソッドでしょうArrays.sort(double[])

アイデアは、同じ変更 (たとえば、値at がin のindex i値と入れ替わる) を別の整数配列に反映させたいというものです(同じインデックスの値が で変更されるという意味で)。index jarr1arr2arr2

Javaでこれを達成する簡単な方法(トリック)はありますか? または、ソートアルゴリズムを自分で実装する唯一の方法ですか?

UPDATEarr1 : 2 つの配列を、2 つの値 (1 つは fromと 1 つは from )を含むオブジェクトの 1 つの配列に置き換えることを人々が推奨していることがわかりますarr2。これにより、効率が低下することはありません。つまり、プリミティブ型 (この場合は double) の配列よりもオブジェクトの配列をソートする方が効率が悪いのではないでしょうか?

データは完全に静的です。大きい (メモリに収まる) が、静的です。

4

4 に答える 4

10

並べ替えられた並列配列を維持しようとするのではなく、よりクリーンなソリューションは、両方のデータ値をカプセル化し、オブジェクトの配列を 1 つだけ持つクラスを作成することです。

(しかし、あなたの質問に答えるために、Java でこれを行う組み込みの方法はありません。2 つの配列をそのうちの 1 つの値に基づいて並べ替える独自の並べ替えルーチンを実装すると、可能性が低い少量のデータに対して機能します。変更することはできますが、維持するのは困難です。)

于 2012-10-10T16:53:31.630 に答える
1

ソートのパフォーマンスに影響を与えない 1 つの解決策、つまり、依然として O(nlog(n)) 時間の複雑さです。

  • 地図を使って保管する array[i] -> i
  • 配列をソートする
  • ソートされた配列を反復処理し、値ごとに、それをマップのキーとして使用して元のインデックスを取得します。

編集:ライハンのコメントは私を惨めに見せます:(

于 2012-10-10T16:54:05.480 に答える
1

この方法で試してみてください....

-arrayこれをArrayList使用して変換しますArrays.asList()

-別のリスト オブジェクト参照変数を作成し、同じ ArrayList オブジェクトをそれに割り当てます。これで、最初の ArrayList に対するすべての変更が 2 番目の ArrayList に反映されます。

例えば:

double[] array = new double[10];

ArrayList<Double> arList_1 = new ArrayList<Double>(Arrays.asList(array));

ArrayList<Double> arList_2 = arList2;

並べ替えには、次の 2 つのオプションがあります。

- 1 つの方法でのみjava.lang.Comparable並べ替えたい場合は、Interface を使用します。

-複数の方法java.util.Comparatorで並べ替えたい場合は、Interface を使用します。

于 2012-10-10T16:55:21.330 に答える
0

何を探しているのかを確認してください。ただし、別の回避策は次のようになります。

要素間の関係を維持するためのマップを作成しarr1ますarr2

      Map<Double, Double> myLocalMap<Double, Double>();
      for(int ind=0; indx < arr1.length; indx++){
           myLocalMap.put(Double.valueOf(arr1[indx]), Double.valueOf(arr2[indx]));
      }

arr1あなたが言ったように今ソート:

     Arrays.sort(arr1); 

arr1がソートされたら、次のように更新arr2します。

      for(int ind=0; indx < arr1.length; indx++){
          arr2[indx] = myLocalMap.get(arr1[indx]).doubleValue();
      }
于 2012-10-10T16:59:17.900 に答える