对值差异排序数组

时间:2015-11-01 09:35:02

标签: c# arrays sorting

我有一个数组,例如

string[] stArr= new string[5] { "1#3", "19#24", "10#12", "13#18", "20#21" };

我想在

上对此数组进行排序
3-1=2;
24-19=5;
12-10=2;
18-13=5;
21-20=1;

,排序结果应该像

string[] stArr= new string[5] { "20#21", "1#3", "10#12", "13#18", "20#21" };

我必须找到所有可能情况的解决方案。

  

1>数组的长度不固定(数组中的元素)

     

2> y总是大于x e.g x#y

     

3>我不能使用列表

5 个答案:

答案 0 :(得分:3)

您可以使用LINQ:

var sorted = stArr.OrderBy(s => s.Split('#')
                                 .Select(n => Int32.Parse(n))
                                 .Reverse()
                                 .Aggregate((first,second) => first - second));

对于您的案例:

stArr = stArr.OrderBy(s => s.Split('#')
                                     .Select(n => Int32.Parse(n))
                                     .Reverse()
                                     .Aggregate((first,second) => first - second)).ToArray();

答案 1 :(得分:2)

试试这个

string[] stArr = new string[5] { "1#3", "19#24", "10#12", "13#18", "20#21" };
Array.Sort(stArr, new Comparison<string>(compare));

int compare(string z, string t)
{
    var xarr = z.Split('#');
    var yarr = t.Split('#');

    var x1 = int.Parse(xarr[0]);
    var y1 = int.Parse(xarr[1]);
    var x2 = int.Parse(yarr[0]);
    var y2 = int.Parse(yarr[1]);

    return (y1 - x1).CompareTo(y2 - x2);
}

答案 2 :(得分:1)

解决此问题与解决代码指定顺序的任何其他排序问题相同 - 您必须编写自定义比较方法,并将其传递给内置分拣机。

在你的情况下,这意味着写下这样的东西:

private static int FindDiff(string s) {
    // Split the string at #
    // Parse both sides as int
    // return rightSide-leftSide
}
private static int CompareDiff(string a, string b) {
    return FindDiff(a).CompareTo(FindDiff(b));
}
public static void Main() {
    ... // Prepare your array
    string[] stArr = ...
    Array.Sort(stArr, CompareDiff);
}

此方法使用Array.Sort overloadComparison<T>方法中实施的CompareDiff委托。解决方案的核心是FindDiff方法,该方法接受一个字符串,并生成一个必须用于比较的数值。

答案 3 :(得分:0)

您可以尝试以下(使用传统方式)

public class Program
{
    public static void Main()
    {
        string[] strArr= new string[5] { "1#3", "19#24", "10#12", "13#18", "20#21" };
        var list = new List<Item>();
        foreach(var item in strArr){
            list.Add(new Item(item));
        }
        strArr = list.OrderBy(t=>t.Sort).Select(t=>t.Value).ToArray();
        foreach(var item in strArr)
            Console.WriteLine(item);

    }   
}

public class Item
{
    public Item(string str)
    {
        var split = str.Split('#');
        A = Convert.ToInt32(split[0]);
        B = Convert.ToInt32(split[1]);
    }
    public int A{get; set;}
    public int B{get; set;}

    public int Sort { get { return Math.Abs(B - A);}}

    public string Value { get { return string.Format("{0}#{1}",B,A); }}
}

这是一个有效的demo

希望它会帮助你

答案 4 :(得分:0)

没有LINQ和列表:)旧学校。

static void Sort(string [] strArray)
    {            
        try
        {

            string[] order = new string[strArray.Length];
            string[] sortedarray = new string[strArray.Length];
            for (int i = 0; i < strArray.Length; i++)
            {
                string[] values = strArray[i].ToString().Split('#');                    
                int index=int.Parse(values[1].ToString()) - int.Parse(values[0].ToString());
                order[i] = strArray[i].ToString() + "," + index;                    
            }
            for (int i = 0; i < order.Length; i++)
            {
                string[] values2 = order[i].ToString().Split(',');
                if (sortedarray[int.Parse(values2[1].ToString())-1] == null)
                {
                    sortedarray[int.Parse(values2[1].ToString())-1] = values2[0].ToString();
                }
                else
                {
                    if ((int.Parse(values2[1].ToString())) >= sortedarray.Length)
                    {
                        sortedarray[(int.Parse(values2[1].ToString())-1) - 1] = values2[0].ToString();
                    }
                    else if ((int.Parse(values2[1].ToString())) < sortedarray.Length)
                    {
                        sortedarray[(int.Parse(values2[1].ToString())-1) + 1] = values2[0].ToString();
                    }
                }                    
            }

            for (int i = 0; i < sortedarray.Length; i++)
            {
                Console.WriteLine(sortedarray[i]);
            }
            Console.Read();
        }
        catch (Exception ex)
        {

            throw;
        }
        finally
        {

        }