2013-06-13 16 views
8

私は2つの配列を持っています。同じインデックス番号で並べ替える必要があります。例えば、私はこれらを持っている:同じインデックスで2つの配列をソートするには?

int[] a = {120, 60, 50, 40, 30, 20}; 
int[] b = {12, 29, 37, 85, 63, 11}; 

Array.Sort(b); // Now, b is -> b = {11, 12, 29, 37, 63, 85} 

私はBのインデックスでソートしたい - >a = {20, 120, 60, 50, 30, 40}

私も文字列の配列c -> c = {"b", "u", "r", "s", "a", "1"}

を持っている場合、私はBのインデックスで、Cをソートしたい - >c = {"1", "b", "u", "r", "a", "s"}

どうすればいいですか? ありがとうございます、 よろしく。

+2

ルック:http://stackoverflow.com/questions/1760185/c-sharp-sort-list-while-also-returning-the-original-index-positions –

+0

これは私のために有用です。 Array.Sort(b、d); – 1teamsah

答えて

21

2つの入力配列を受け入れるArray.Sort<TKey, TValue>(TKey[] keys, TValue[] items)を使用します.1つはキーの配列であり、もう1つはそれらのキーを使用して並べ替える項目の配列です。ここでは、あなたのためにbがあなたの鍵であり、aがあなたのアイテムです。したがって

Array.Sort(b, a); 

aの項目をソートするbのキーを使用します。

は私がcbによってのインデックスをソートしたい - >c = {"1", "b", "u", "r", "a", "s"}

あなたが意味を正確に明確ではありません。同時にをbを使用して並べ替えると同時に?もしそうなら、それでも上記を使用できるので簡単です。 Zip aおよびcTuple<int, string>の単一アレイに挿入する。そして

var d = a.Zip(c, (x, y) => Tuple.Create(x, y)).ToArray(); 

:上記のように

Array.Sort(b, d); 

。そして、作品を抽出します。

a = d.Select(z => z.Item1).ToArray(); 
c = d.Select(z => z.Item2).ToArray(); 

を別の方法として、あなたはキーの同じセットを使って、配列の多くをソートする必要がある場合:今、あなたはあなたが必要とするすべてのアレイをソートするindexesを使用することができます

int[] indexes = Enumerable.Range(0, b.Length).ToArray(); 
Array.Sort(b, indexes); 

。例えば、

a = indexes.Select(index => a[index]).ToArray(); 
c = indexes.Select(index => c[index]).ToArray(); 

などがある。

おそらく多少のコーディングエラーがあります。便利なコンパイラはありません。この質問に

+0

これは素晴らしいですが、System.Collections.IComparerを実装していないdouble []のため、バージョン1.3より前の.NET Standardで動作させることはできません。 –

2
// a dirty and inefficient way of doing it, 
// but should give you a heads up to get started 

    // you obviously dont want to modify array b, so making a copy 
    int[] c = Arrays.copyOf(b, b.length); 
    // now apply a sort on 'c' and apply the same operation on 'a' when modifying 'c' 
    // -> applying a bubble sort - > inefficient 
    for(int i = 0; i < c.length ; i ++) { 
     for(int j = 0 ; j < c.length - 1; j ++) { 
      if(c[j] > c [j+1]) { 
       c[j] = c[j] + c[j+1]; 
       c[j+1] = c[j] - c[j+1]; 
       c[j] = c[j] - c[j+1]; 

       // apply the same to a 
       a[j] = a[j] + a[j+1]; 
       a[j+1] = a[j] - a[j+1]; 
       a[j] = a[j] - a[j+1]; 
      } 
     } 
    } 
関連する問題