使用 2 个其他数组对数组进行排序

Posted

技术标签:

【中文标题】使用 2 个其他数组对数组进行排序【英文标题】:Sort an array using 2 other arrays 【发布时间】:2018-05-05 20:02:12 【问题描述】:

这是一个奇怪的特殊情况,但我有 3 个数组,所有数组都具有灵活的大小(但相同)和贵重物品,我需要使用另外 2 个来订购其中一个。 比如

int[] array1 = new int[0 ,1 ,1 ,1 ,0];
int[] array2 = new int[5 ,3 ,4 ,2 ,0];
int[] array3 = new int[0 ,1 ,2 ,3 ,4];

// Results array3 == [2,1,3,0,4]

我想首先按第一个数组的值对第三个数组进行排序,并在第一个数组无法排序的情况下使用第二个数组。 有没有办法干净地做到这一点,还是我必须硬编码?

【问题讨论】:

如果可能的话,我建议您创建一个包含三个相关值的类并使用一个数组。像这样在单独的数组中包含相关值是一种常见的反模式。 创建一个包含 3 个 int 值的元组。然后使用自定义比较器 unity使用的c#版本不支持元组。 @Joska Unity 支持 C#6 的元组,您需要切换到 .NET 4.x 等效脚本运行时版本。 我试试看,谢谢 【参考方案1】:

正如那些在 cmets 中所说的那样,在元组或类中这样做会更好

        var array1 = new int[]  0, 1, 1, 1, 0;
        var array2 = new int[]  5, 3, 4, 2, 0;
        var array3 = new int[]  0, 1, 2, 3, 4;

        var listOfTuples = array1.Select((t, i) => new Tuple<int, int, int>(t, array2[i], array3[i])).ToList();
        listOfTuples = listOfTuples.OrderBy(t => new t.Item1, t.Item2).ToList();

这些将由 array1 然后 array2 排序。

如果您想要一个没有元组的解决方案,请在 cmets 中添加。

【讨论】:

由于 unity 使用的是非常旧的 c# 版本,我无法访问元组:/ 虽然***.com/questions/7120845/…很容易创建一个 当然,您只需将 .OrderBy(...) 更改为 .OrderBy(t =&gt; t.Item1).ThenBy(t =&gt; t.Item2) 即可,无需创建额外的 IComparer。 @Trevor 我有点不知道 ThenBy。我编辑了我的答案。基本上现在它真的是单行的,即使没有原生 c# 元组。【参考方案2】:

要让它与较旧的 .NET 版本(如 3.5)一起使用,请使用 Select() 将数组转换为匿名对象列表(基本上类似于元组)。然后使用OrderBy()ThenBy() 根据第一个数组和第二个数组中的值对列表进行排序:

var array1 = new int[]  0, 1, 1, 1, 0;
var array2 = new int[]  5, 3, 4, 2, 0;
var array3 = new int[]  0, 1, 2, 3, 4;

var list = array1.Select((t, i) => new  X1 = t, X2 = array2[i], X3 = array3[i] )
                 .OrderBy(t => t.X1) // first order by values from array1
                 .ThenBy(t => t.X2)  // then by values from array2
                 .Select(t => t.X3)  // we only want values from array3
                 .Reverse();         // put into right order

输出:

2 1 3 0 4

【讨论】:

以上是关于使用 2 个其他数组对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

sort() 数组的元素进行排序的方法

如何在Vue中对具有2个字段的数组进行排序?

如何在 Iphone SDK 中基于单个数组对多个数组进行排序

根据另一个 id 数组对对象数组进行排序

使用线性时间算法对仅包含 3 个字母的数组中的 2 个字母字符串进行排序

如何按列对多维数组进行排序?