2

我从服务器获取一个数组并将其存储在 NSMutableArray 中。现在的问题是数组没有排序。例如。数组 = ["A","B","无","C","D"]。我想对其进行排序并最后放置“无”元素。即 ["A","B","C","D","None"]。尝试交换但无法匹配条件,因为将来数组可能会增加。检查下面的代码,它没有按预期工作。

if array.containsObject( "None" ){
        print("\(array.indexOfObject("None"))")
        let noneIndex = array.indexOfObject("None")
        print(noneIndex)
        array.removeObject(noneIndex)
        print("Remove Array:-\(array)")
        array.insertObject(noneIndex, atIndex: (array.lastObject?.index)!)
        print("Sorted Array:-\(array)")
    }
4

4 回答 4

2

也许我误解了你需要做什么,但sorted()如果你只想按字母顺序排序,你可以在你的数组上使用。

您还可以使用filter从数组中删除“None”,对其进行排序,然后将“None”附加为最后一个元素

例如,如果你有

let elements = ["Alpha", "Bold", "None", "charlie", "Delta", "echo", "zebra", "k"]

您可以从过滤它开始:

let filteredElements = elements.filter { $0.uppercased() != "NONE"}

对过滤后的元素进行排序:

var sortedElements = filteredElements.sorted { $0.uppercased() < $1.uppercased()}

附加“无”

sortedElements.append("None") // ["Alpha", "Bold", "charlie", "Delta", "echo", "k", "zebra", "None"]

并完成。

这里结合起来:

let lastElement = "None"
let elements = ["Alpha", "Bold", "None", "charlie", "Delta", "echo", "zebra", "k"]
var sortedElements = elements.filter({$0.uppercased() != lastElement.uppercased()}).sorted(by: {$0.uppercased() < $1.uppercased()})
sortedElements.append(lastElement)

希望对您有所帮助。

于 2016-12-15T07:53:49.417 回答
1
var array = ["A", "B", "None", "C", "D"]
if let noneIndex = array.index(of: "None") {
    array.remove(at: noneIndex)
    array.append("None")
}
print(array)
于 2016-12-15T07:50:50.827 回答
1

这应该None在数组的末尾移动,并对其他元素进行排序:

let ["A", "B", "None", "C", "D"]
array.sorted { $1 == "None" || $0 < $1 } // ["A", "B", "C", "D", "None"]

这只是利用了by可以传递给sort/sorted方法的参数的好处Array

编辑@MartinR 对来自这个答案的比较谓词有一个非常强的观点,它确实没有提供strong weak ordering. 使用正确的谓词对数组进行排序将遵循以下原则:

array.sorted { $0 == "None" ? false : $1 == "None" ? true : $0 < $1 }
于 2016-12-15T08:04:06.390 回答
0

这将起作用:

// starting test array
let array = ["B", "None", "C","P","None","A", "Q"]
var sorted = array.sorted { (str1, str2) -> Bool in
    return str1 < str2
}

sorted.forEach { str in
    if str == "None" {
        if let idx = sorted.index(of: str) {
            sorted.remove(at: idx)
            sorted.append(str)
        }
    }
}

// Sorted array is now ["A", "B", "C", "P", "Q", "None", "None"]
于 2016-12-15T07:58:10.110 回答