2016-08-25 5 views
0

英数字をソートしたいのですが、数字は始まりではなく末尾に来るはずです。英数字配列をソートすると、連続した数字が最後に存在するはずです

[ "!"、 "1"、 "3"、 "A"、 "B"、 "Z"]

:インスタンス

let array = ["1", "a", "b", "z", "3", "!"] 
let sortedArray = array.sort { (firstObject, secondObject) -> Bool in 
    firstObject < secondObject 
} 

出力用要求出力:

[ "A"、 "B"、 "Z"、 "1"、 "3"、 "!"]

ありがとうございます。

+2

so?なぜあなたはちょうどそれをやろうとしないのですか?明らかに 'firstObject luk2302

+0

ここでの並べ替えのルールは何ですか?なぜ "!"ソートされた配列の終わりですか? – larva

+0

希望の結果が一般的な順序付け規則と異なる場合、この作業にはカスタム解決策が必要です(感嘆符が最後にあり、アルファベット文字の後ろに数字があるため)。 – pedrouan

答えて

1

をここにあなたのケースのために機能するソリューションです:

期待される結果は次のとおりです。最初

  • 手紙。
  • 次に数字。
  • 他;

これを行う方法があります。

// Works with both arrays 
var array = ["1", "b", "a", "z", "3", "!"] 
//var array = ["1", "b", "A", "Z", "3", "!"] 

func isLetter(char: String) -> Bool { 
    return ("a"..."z").contains(char) || ("A"..."Z").contains(char) 
} 

func isNumber(char: String) -> Bool { 
    return Int(char) != nil 
} 

let letters = array.filter(isLetter).sort{$0.lowercaseString < $1.lowercaseString} 
let numbers = array.filter(isNumber).sort{Int($0) < Int($1)} 
let others = Array(Set(array).subtract(letters).subtract(numbers)).sort{$0 < $1} 

let sortedArray = letters + numbers + others 

最初の配列は、第二は、それはあなたが何をしたいん

["A", "b", "Z", "1", "3", "!"] 

だろう

["a", "b", "z", "1", "3", "!"] 

だろう。単体テストを含め、メソッドの中にラップしておいてください。 Buuuut、それは全く「きれい」ではありません。

+0

うまく動作します! – Vishnuvardhan

1

の番号は、の代わりに最後に来るはずです」というメッセージを受信し、予期しない "!"ソート。そして、あなたがこれを行うことができます:

let array = ["1", "a", "b", "z", "3", "!"] 
let sortedArray = array.sort { (firstObject, secondObject) -> Bool in 
    let firstIsNumber = firstObject.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet())?.count > 0 
    let secondIsNumber = secondObject.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet())?.count > 0 
    if firstIsNumber != secondIsNumber {return secondIsNumber} 
    return firstObject < secondObject 
} 
print(sortedArray) 
//["!", "a", "b", "z", "1", "3"] 
関連する問題