2015-11-01 85 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 
     { 

     }