如何按相同的索引对两个数组进行排序?

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"

不清楚你的意思。在您使用ba 进行排序的同时?如果是这样,这很容易,因为我们仍然可以使用上述内容。将ac 压缩到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];
            
        
    

【讨论】:

以上是关于如何按相同的索引对两个数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 对两个数组进行排序

如何使用两个 Ui Range Sliders 对相同的数据进行排序

在结构中按频率对数组中的字母进行排序

如何按值对数组进行排序(排序)? *有一个转折*

使用宇宙飞船运算符按两个参数对数组进行排序[重复]

如何对 Perl 哈希值进行排序并相应地对键进行排序(可能在两个数组中)?