【问题标题】:Sorting jagged array对锯齿状数组进行排序
【发布时间】:2016-04-20 14:00:58
【问题描述】:
var data = read();
switch (selector)
{
    case 1://accending
        data = data.OrderBy(inner => inner[2]).ToArray();
        drawChart();
        for (int i = 0; i < data[0].Length; i++)
        {
            for (int j = 0; j < data.Length; j++)
            {
            if (j != 0)
                {
                    Console.Write("     ");
                }
                Console.Write(data[j][i] + "  ");
            }
            Console.WriteLine();
        }
        complete = true;
        break;
    case 2://decending
        complete = true;
        break;
    default:
        Console.WriteLine("Not an option please enter a number between 1 and 2");
        break;
}

我有一个名为 data 的交错数组正在打印,我需要能够根据用户输入(case1 和 2)对数组进行排序

说数据看起来像这样

jaggedarray[0] = new int[5] { 99, 999, 49, 79, 59 };
jaggedarray[1] = new int[3] { 199, 1999, 149 };
jaggedarray[2] = new int[2] { 999, 500 };

如何对其进行排序,以便将第二列从高到低排序,然后打印出整个数组?

【问题讨论】:

    标签: c# arrays sorting jagged-arrays


    【解决方案1】:

    Hari Prasad 回答的另一种方法,非常好。

    您可以使用Array.Sort 进行排序,并使用Comparison 定位到第二列。

    类似这样的:

    var jaggedarray = new int[3][];
    
    jaggedarray[0] = new int[5] { 99, 999, 49, 79, 59 };
    jaggedarray[1] = new int[3] { 199, 1999, 149 };
    jaggedarray[2] = new int[2] { 999, 500 };
    
    Array.Sort(jaggedarray,  new Comparison<int[]>( 
        (x,y) => { return x[1] < y[1] ? -1 : (x[1] > y[1] ? 1 : 0); }
    ));
    

    【讨论】:

      【解决方案2】:

      如果我对您的理解正确并且您有此输入

      var jagged = new int[3][]
      {
          new int[3] { 6, 4, 5 },
          new int[3] { 2, 4, 1 },
          new int[3] { 3, 1, 2 }
      };
      

      你正在寻找这个输出(按第三个数字排序,即第二列索引)

      var jagged = new int[3][]
      {
          new int[3] { 2, 4, 1 },
          new int[3] { 3, 1, 2 },
          new int[3] { 6, 4, 5 }
      };
      

      那你可以用这个来做:

      var columnIdx = 2;
      Array.Sort(jaggedArray, (x, y) => x[columnIdx].CompareTo(y[columnIdx]));
      

      【讨论】:

      • 谢谢。为我工作
      【解决方案3】:

      使用Skip 跳过OrderBy 中的第一列并使用First 选择第二列以对该元素进行排序。

      jaggedarray[0] = new int[5] { 99, 999, 49, 79, 59 };
      jaggedarray[1] = new int[3] { 199, 1999, 149 };
      jaggedarray[2] = new int[2] { 999, 500 };
      
      jaggedarray = jaggedarray.OrderBy(j=>j.Skip(1).First()).ToArray(); // sort on second column.
      

      工作Demo

      【讨论】:

        【解决方案4】:

        试试这个:

            int[][] jaggedarray = new int[3][];
            jaggedarray[0] = new int[5] { 99, 999, 49, 79, 59 };
            jaggedarray[1] = new int[3] { 199, 1999, 149 };
            jaggedarray[2] = new int[2] { 999, 500 };
        
            int arrayToSort = 2;
            int selector = 1;
        
            jaggedarray = Enumerable.Range(0, jaggedarray.Length).Select(x =>
            {
                if (x == arrayToSort)
                {
                    if (selector == 2)
                            return jaggedarray[x].OrderByDescending(y => y).ToArray();
                    return jaggedarray[x].OrderBy(y => y).ToArray();
                }
                return jaggedarray[x];
            }).ToArray();
        
            Console.WriteLine(jaggedarray);
        

        【讨论】:

        • 这可行,但只对数组的第一列进行排序?是否可以根据用户输入对列进行排序。例如,如果用户输入 2,它将按第二列而不是第一列排序,干杯
        • 我明白你在说什么。我已经相应地更新了代码。
        【解决方案5】:

        根据内部数组的第二个元素进行比较

        // Example array
        int[][] intervals = new int[][] { new int[] { 1, 2 }, new int[] { 3, 5 }, new int[] { 4, 7 }, new int[] { 6, 8 }, new int[] { 9, 10 } };
        
        // Sort by second element
        Array.Sort(jaggedArray, (x, y) => x[1].CompareTo(y[1]));
        
        

        打印出整个锯齿状数组

        Console.WriteLine("[" + String.Join(",",intervals.ToList().Select(p=>"["+p[0].ToString()+","+p[1].ToString()+"]")) + "]");
        
        

        输出:[[1,2],[3,8],[9,10]]

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请编辑您的答案以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-14
        • 2011-03-27
        • 2023-01-10
        • 2011-12-31
        • 2020-12-21
        • 2020-12-31
        • 2016-08-08
        相关资源
        最近更新 更多