2013-06-13 42 views
8

Tôi có 2 mảng. Tôi muốn sắp xếp chúng theo cùng một số chỉ mục. Ví dụ tôi có những:Làm thế nào để sắp xếp hai mảng theo cùng một chỉ mục?

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} 

Tôi muốn sắp xếp một bởi chỉ số b của ->a = {20, 120, 60, 50, 30, 40}

Nếu tôi cũng có chuỗi mảng c -> c = {"b", "u", "r", "s", "a", "1"}

Tôi muốn sắp xếp c bằng b của chỉ số ->c = {"1", "b", "u", "r", "a", "s"}

Tôi làm cách nào để thực hiện việc này? Xin cảm ơn trước, Trân trọng.

+2

Nhìn vào câu hỏi này: http://stackoverflow.com/questions/1760185/c-sharp-sort-list-while-also-returning-the-original-index-positions –

+0

này rất hữu ích đối với tôi . Array.Sort (b, d); – 1teamsah

Trả lời

21

Sử dụng Array.Sort<TKey, TValue>(TKey[] keys, TValue[] items) chấp nhận hai mảng đầu vào, một là mảng khóa, còn lại là mảng các mục cần sắp xếp bằng cách sử dụng các khóa đó. Ở đây, dành cho bạn, b là chìa khóa của bạn và a là các mục của bạn.

Như vậy:

Array.Sort(b, a); 

sẽ sử dụng các phím của b để sắp xếp các hạng mục a.

Tôi muốn sắp xếp c bởi b index 's ->c = {"1", "b", "u", "r", "a", "s"}

Không rõ chính xác những gì bạn muốn nói. Đồng thời khi bạn sắp xếp a sử dụng b? Nếu vậy, thật dễ dàng vì chúng ta vẫn có thể sử dụng ở trên. Zip ac thành một mảng duy nhất là Tuple<int, string>.

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

Sau đó:

Array.Sort(b, d); 

như trên. Sau đó giải nén các mảnh:

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

Ngoài ra, nếu bạn cần phải sắp xếp rất nhiều mảng bằng cách sử dụng cùng một bộ phím:

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

Bây giờ bạn có thể sử dụng indexes để sắp xếp tất cả các mảng mà bạn cần. Ví dụ:

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

, v.v. nếu cần.

Có thể có một số lỗi mã hóa nhỏ ở đây. Không có trình biên dịch tiện dụng.

+0

Điều này là tuyệt vời, nhưng tôi không thể làm cho nó hoạt động trên .NET Standard trước phiên bản 1.3 do double [] không triển khai System.Collections.IComparer. –

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]; 
      } 
     } 
    } 
Các vấn đề liên quan