【问题标题】:Sort an integer array by given starting integer按给定的起始整数对整数数组进行排序
【发布时间】:2023-03-26 22:46:01
【问题描述】:

我有一个数组:

int[] months = new int[4] {1, 4, 7, 10};

我想从给定值开始对数组进行排序,然后按原始顺序对数组的其余部分进行排序。

假设我想开始按值7 对数组进行排序。排序后的数组将按以下顺序排列:

7, 10, 1, 4

或者从值4 开始,排序后的数组将是
4, 7, 10, 1

【问题讨论】:

    标签: c# algorithm sorting


    【解决方案1】:

    怎么样:

    var orderedMonths = months.Where(x => x >= 7)
                              .OrderBy(x => x)
                              .Concat(months.Where(x => x < 7));
    

    请注意,这意味着“数组的其余部分”的元素将按出现顺序排列,而不是按数字递增顺序排列。如果您的意思是后者(即对两个“段”进行数字排序),我会这样做:

    var orderedMonths = months.OrderBy(x => x < 7) // false comes before true
                              .ThenBy(x => x);
    

    另一方面,如果您想按出现顺序对这两个片段进行排序,我会这样做:

    var orderedMonths = months.GroupBy(x => x < 7)
                              .OrderBy(group => group)
                              .SelectMany(x => x);
    

    (或)

    var orderedMonths = months.Where(x => x >= 7)
                              .Concat(months.Where(x => x < 7));
    

    【讨论】:

    • 您可以在数组上使用 .Where 和 .OrderBy 与 lambda 值吗?
    • @TravisJ:当然,int[]IEnumerable&lt;int&gt;。然后编译器将在 Enumerable 类中的 IEnumerable&lt;T&gt; 上使用 LINQ to Objects 扩展方法。
    • @Ani:对我来说算法不正确,因为如果您查看 OP 提供的规范,您会发现排序不是由 value 提供的,而是由 @987654330 完成的@ 数组中的那个值。换句话说,通过&gt;=7 选择的东西是不正确的。
    • @Tigran:这两种方式都不清楚,因为提供的数组已经排序。不过我明白你的意思。让我们等待OP的澄清。 :)
    • @Ani 哦,很酷,我不知道 :) 我认为这些运算符仅适用于建模对象,但它们适用于所有可枚举的对象是有道理的。
    【解决方案2】:

    假设这是你可以排序的 int 数组

    int[] months = new int[4] { 1, 4, 7, 10 };
    int value = 10; 
    int[] chk1 = new int[4];
    chk1 = months.SkipWhile(a => a != value).
                    Concat(months.TakeWhile(a => a != value)).ToArray();
    

    这应该会为您提供所需的订单

    【讨论】:

    • 如果数组需要是动态的,就很难做到这一点,就制作 chk1 而言。
    • 啊,我不在编译器附近,不确定初始化数组的限制有多严格。
    【解决方案3】:

    你可以使用列表吗?

    int NumberToBeFound = 7;
    int IndexOfNumber = -1;
    for(int i=0;i<months.count;i++){
      if(months[i] == NumberToBeFound){
        IndexOfNumber = i;
        break;
      }
    }
    List<int> Sorted = new List<int>();
    for(int i = IndexOfNumber; i < months.count;i++){
      Sorted.Add(months[i]);
    }
    for(int i = 0; i < IndexOfNumber; i++){
      Sorted.Add(months[i]);
    }
    months = Sorted.ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 2013-11-04
      相关资源
      最近更新 更多