如何对不同大小的整数数组列表进行排序?

时间:2015-02-14 17:05:55

标签: c# arrays sorting

我已经做了一些广泛的搜索,所以如果这是重复请宰我:D

我有一个字节数组列表(List),其中数组的长度各不相同。我需要按数组长度按升序排序列表,然后按数组中的字节排序(请参阅示例)。

示例:

我想从:

{0,1,2}
{0,4}
{0,3,2}
{0,1,3}
{0,2,4,6,1}
{0,1,1}
{0,3,4,5}

为:

{0,4}
{0,1,1}
{0,1,2}
{0,1,3}
{0,3,2}
{0,3,4,5}
{0,2,4,6,1}

它基本上是字母顺序,但是有一组数字而不是字符(可以说是同一个东西),任何想法?

2 个答案:

答案 0 :(得分:8)

您唯一需要做的就是实现IComparer<T>接口并将其提供给排序算法。在这种情况下,算法看起来像:

public ByteArrayComparer : IComparer<byte[]> {

    public int Compare (byte[] ba, byte[] bb) {
        int n = ba.Length;  //fetch the length of the first array
        int ci = n.CompareTo(bb.Length); //compare to the second
        if(ci != 0) { //if not equal return the compare result
            return ci;
        } else { //else elementwise comparer
            for(int i = 0; i < n; i++) {
                if(ba[i] != bb[i]) { //if not equal element, return compare result
                    return ba[i].CompareTo(bb[i]);
                }
            }
            return 0; //if all equal, return 0
        }
    }

}

接下来,您可以使用List<T>.Sort方法:

List<byte[]> data = new List<byte[]>();
//add arrays to data
data.Sort(new ByteArrayComparer());
//data is now sorted

排序算法要求比较器有效,如果比较器满足排序关系的三个约束,则比较器有效:

  1. 反身性:如果将元素与自身进行比较,请返回0;
  2. 反对称:如果 x 小于 y (返回小于0的内容),则 y 大于 x (大于0的东西);
  3. 传递:如果 x 小于 y y 小于 z ,然后 x 小于 z
  4. 如果比较器不满足该关系,则排序算法将无法正确排序,因为您的订单没有意义。

答案 1 :(得分:1)

为什么不简单地使用LINQ

MyList = MyList.OrderBy(arr=>arr.Length).ThenBy(arr =>arr.Sum()).ToList();

一个工作示例:

   List<int[]> a = new List<int[]>();

   int[] t1 = { 0, 4 };
   int[] t2 = { 0, 1, 2 };
   int[] t3 = { 0, 1, 3 };
   int[] t4 = { 0, 2, 4, 6, 1 };
   int[] t5 = { 0, 1, 1 };
   int[] t6 = { 0, 3, 4, 5 };

   a.Add(t1);
   a.Add(t2);
   a.Add(t3);
   a.Add(t4);
   a.Add(t5);
   a.Add(t6);

   a = a.OrderBy(arr=>arr.Length).ThenBy(arr =>arr.Sum()).ToList();

    foreach (int[] item in a)
    {
        foreach (int item2 in item)
        {
             Console.Write(" "+item2);
      }
      Console.WriteLine();
   }

示例输出:

0 4
0 1
0 1 2
0 1 3
0 3 4 5
0 2 4 6 1

正如所指出的那样,在{3 4 5},{4 5 3}

等情况下,这可能会失败