如何按相同的索引对两个数组进行排序?
Posted
技术标签:
【中文标题】如何按相同的索引对两个数组进行排序?【英文标题】:How to sort two arrays by same index? 【发布时间】:2013-06-09 18:30:36 【问题描述】:我有 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 进行排序 -> a = 20, 120, 60, 50, 30, 40
如果我还有字符串数组c -> c = "b", "u", "r", "s", "a", "1"
我想按 b 的索引对 c 进行排序 -> c = "1", "b", "u", "r", "a", "s"
我该怎么做? 提前致谢, 问候。
【问题讨论】:
看这个问题:***.com/questions/1760185/… 这对我很有用。 Array.Sort(b,d); 【参考方案1】:使用Array.Sort<TKey, TValue>(TKey[] keys, TValue[] items)
接受两个输入数组,一个是键数组,另一个是使用这些键排序的项目数组。在这里,b
是您的钥匙,a
是您的物品。
因此:
Array.Sort(b, a);
将使用b
的键对a
的项目进行排序。
我想按
b
的索引对c
进行排序->c = "1", "b", "u", "r", "a", "s"
不清楚你的意思。在您使用b
对a
进行排序的同时?如果是这样,这很容易,因为我们仍然可以使用上述内容。将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();
等等。根据需要。
这里可能有一些小的编码错误。没有方便的编译器。
【讨论】:
这很好,但由于 double[] 没有实现 System.Collections.IComparer,我无法在 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];
【讨论】:
以上是关于如何按相同的索引对两个数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章