-2

我有一个列表(我可以将其实现为任何类型的集合都可以提供简洁的解决方案),如下所示:

4,1,5,2,1,3,8,1,6,4,2,3

该列表实际上是由 3 个值组成的组,它的长度始终是 3 的倍数。组的前 2 个值与组的第 3 个值之间没有关系。

我想对数组进行排序,以使每个第三个值都保留在原位。对于我给出的示例,结果将是:

1,1,5,1,2,3,2,4,6,4,8,3

索引为 0、1、3、4、6 和 7 的元素已排序。索引为 2,5 和 8 的元素尚未排序。

另一种表达方式是想象列表是 x,x,y,x,x,y,x,x,y,x,x,y 并且我只想对 xs 进行排序。

我可以写一个算法,但想知道是否有简洁的方法来做到这一点?

4

3 回答 3

2

除非您非常渴望真正有效地做到这一点,否则我会寻求一个简单的解决方案:

  • 将要排序的元素提取到新列表中
  • 对列表进行排序
  • 构建一个新列表,将要排序的元素与固定的元素合并,或者(如果您更喜欢使用可变集合)只需将已排序的元素放回原始列表中。

所以像:

var list = ...; // Get hold of the whole list.
var sortedElements = list.Where((value, index) => index % 3 != 2)
                         .OrderBy(x => x)
                         .ToList();
for (int i = 0; i < sortedElements.Count; i++)
{
    int index = (i / 2) * 3 + i % 2;
    list[index] = sortedElements[i];
}
于 2012-12-28T11:05:59.270 回答
1

尝试以下 linq

var ints = new int[]{4,1,5,2,1,3,8,1,6,4,2,3};
var result = ints.Where((i,j) => j%3!= 2).OrderBy(i=>i).ToArray();

var index = ints.Select ((i , j)=> 
    {
        if (j%3==2) 
            return i; 
        else 
            return result[(j/3)*2 + j%3];
    });

它是如何工作的
1. 采用排序数组忽略非必需值
2. 从原始数组准备输出数组,其中每个三元组的前 2 个值来自排序数组。

于 2012-12-28T11:08:26.463 回答
0

我假设取出每三个值并单独保存它,然后对所有内容进行排序并再次插入值是最简单的。

numbers.Where((n, index) => (index + 1) % 3 == 0);
numbers.Where((n, index) => (index + 1) % 3 != 0);

这为您提供了第三个索引的列表以及需要排序的内容。

于 2012-12-28T11:06:03.823 回答