Swift:Alphabetize List忽略“The”

时间:2017-02-22 00:05:17

标签: arrays swift sorting

我正在尝试按字母顺序排列[String:Any]数组。到目前为止我有这个:

    func filterList() {
    self.titleData.sort() {
        item1, item2 in
        let title1 = item1["title"] as! String
        let title2 = item2["title"] as! String
        return title1.localizedCaseInsensitiveCompare(title2) == ComparisonResult.orderedAscending
    }
    self.myCollectionTableView.reloadData()
}

它工作正常。但是,title1和title2是电影标题,因此我想在按字母顺序排列时忽略“The”,但在TableView中返回完整的标题。我尝试的一切(如字符串中包含“The”的子字符串)只是让我感到困惑,任何帮助都表示赞赏!

2 个答案:

答案 0 :(得分:1)

你需要删除任何领先的"" (或" a"或" a"也许 - 并且可能也会处理其他语言)然后比较更新的标题。

这里足以让你开始删除任何领先""。

func removeLeadingArticle(from string: String) -> String {
    // This is a simple example. Expand to support other articles and languages as needed
    let article = "the "
    if string.length > article.length && string.lowercased().hasPrefix(article) {
        return string.substring(from: string.index(string.startIndex, offsetBy: article.length))
    } else {
        return string
    }
}

func filterList() {
    self.titleData.sort() {
        item1, item2 in
        let title1 = removeLeadingArticle(from: item1["title"] as! String)
        let title2 = removeLeadingArticle(from: item2["title"] as! String)

        return title1.localizedCaseInsensitiveCompare(title2) == ComparisonResult.orderedAscending
    }
    self.myCollectionTableView.reloadData()
}

这还没有经过测试,所以可能会有一个拼写错误。

答案 1 :(得分:0)

以下是来自@rmaddy的回答的编辑后的工作代码:

func removeLeadingArticle(string: String) -> String {
    let article = "the "
    if string.characters.count > article.characters.count && string.lowercased().hasPrefix(article) {
        return string.substring(from: string.index(string.startIndex, offsetBy: article.characters.count))
    } else {
        return string
    }
}

func filterList() {
    self.titleData.sort() {
        item1, item2 in
        let title1 = removeLeadingArticle(string: item1["title"] as! String)
        let title2 = removeLeadingArticle(string: item2["title"] as! String)

        return title1.localizedCaseInsensitiveCompare(title2) == ComparisonResult.orderedAscending
    }
    self.myCollectionTableView.reloadData()
}