2017-10-06 10 views
-2

はじめに:私は仕事でこれを見つけ出し、面白い問題だと思った。特別なルールで文字列の集合を並べ替える

はじめにEDIT:すでに解決策がありますが、私はこれに対処する他の方法を探しています。


stringの集合を考える:私は年の降順で、このコレクションをソートしたい

["2015", "2016 New", "2016 Used", "2017 New", "2017 Used", "2018"] 

を。

ただし、文字列"New"を含む年は、文字列"Used"を含む同じ年の前に来なければならない特別なルールを適用したいと考えています。

期待される結果:

["2018", "2017 New", "2017 Used", "2016 New", "2016 Used", "2015"] 

仮定:

  • コレクションが"New"を含む与えられた年の文字列が含まれている場合、コレクションは常に同じ年"Used"(と副を含むことが含まれますが逆もあります)、それ自体が年を含むことはありません。

    ["2017 New", "2017", "2016 Used", "2016"] // invalid input 
    
  • 年は範囲1000-9999の範囲内になります。


この問題にアプローチする最良の方法は何ですか?


EDIT

は、ここに私たちのソリューションです:

var l = new[] { "2015", "2016 New", "2016 Used", "2017 New", "2017 Used", "2018" }; 

var sorted = l.OrderByDescending(i => i.Replace("Used", "Ased")).ToArray(); 
// ["2018", "2017 New", "2017 Used", "2016 New", "2016 Used", "2015"] 
+1

「2017新」は、「使用済み2017」の前に必ずなりますソート。 – Fabio

+0

何か試したことがありますか?私たちはあなたの仕事をしていません。 – HimBromBeere

+1

@Fabioはい、しかし、OPは降順で並べ替えることを望んでいます。したがって、デフォルトのソートでは、 '2018、2017 Used、2017 New、etc etc'となります。 – maccettura

答えて

3

私はあなたの文字列を分割して並べ替えパーツ

var inputx = new string[] { "2015", "2016 New", "2016 Used", "2017 New", "2017 Used", "2018" }; 

var outputx = inputx.OrderByDescending(x => x.Split()[0]).ThenBy(x=>x).ToArray(); 
1

"2017""2017 New"を取得するにすることを使用する場合と、そして"2017 Used""2017"

string[] arr = {"2018", "2017 New", "2017", "2017 Used", "2016"}; 

arr = arr.OrderByDescending(s => s.Split()[0]).ThenBy(s => !s.EndsWith(" New")).ToArray(); 

またはインプレースの並べ替えは、もう少し効率的かもしれません:あなたは、デフォルトでは、単純な並べ替え、それをできるよう

Array.Sort(arr, (a, b) => b.Split()[0].CompareTo(a.Split()[0]) + 
        b.EndsWith(" New").CompareTo(a.EndsWith(" New"))); 
関連する問題