我有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"}
我该怎么做? 提前致谢, 问候。
答案 0 :(得分:21)
使用接受两个输入数组的Array.Sort<TKey, TValue>(TKey[] keys, TValue[] items)
,一个是键数组,另一个是使用这些键排序的项数组。在此,对您而言,b
是您的密钥,a
是您的项目。
因此:
Array.Sort(b, a);
将使用b
的键对a
的项目进行排序。
我希望按
c
的索引对b
进行排序 - &gt;c = {"1", "b", "u", "r", "a", "s"}
不清楚你的意思。在使用a
对b
进行排序的同时?如果是这样,我们仍然可以使用上述内容。将a
和c
压缩到Tuple<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();
或者,如果您需要使用同一组键对许多数组进行排序:
int[] indexes = Enumerable.Range(0, b.Length).ToArray();
Array.Sort(b, indexes);
现在,您可以使用indexes
对所需的所有阵列进行排序。例如:
a = indexes.Select(index => a[index]).ToArray();
c = indexes.Select(index => c[index]).ToArray();
等。根据需要。
这里可能存在一些小的编码错误。没有编译器方便。
答案 1 :(得分: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];
}
}
}