2015-11-01 53 views
1

我有一个数组,例如排序阵列上价值差异

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>ý总是大于X e.g x#y

3>我不能使用列表

+1

你遇到了什么问题? – Jens

+0

okk,让我更新我的问题。 –

+0

你有排序问题阵列? – qxg

回答

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(); 
+0

谢谢你,只是简单的和单行。 :) –

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 overload与在CompareDiff方法来实现的Comparison<T>委托。解决方案的核心是FindDiff方法,该方法接受一个字符串,并生成一个必须用于比较的数字值。

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

希望它会帮助你

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); 
} 
+0

也可以使用这个Array.Sort(stArr,new Comparison ((z,t)=> {return(int.Parse(z.Split('#')[1]) - int。解析(z.Split('#')[0]))。CompareTo(int.Parse(t.Split('#')[1]) - int.Parse(t.Split('#')[0] ));})); –

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 
     { 

     }