【问题标题】:Swift : Sorting three arrays based on a particular arraySwift:根据特定数组对三个数组进行排序
【发布时间】:2016-04-10 12:12:36
【问题描述】:

我有这三个数组:

let codesArray = ["de_DE", "en_US", "en-GB", "es_ES"]
let localesArray = ["Deutsch", "English", "English UK", "Español"]
let internationalsArray = ["German", "English", "British English", "Spanish"]

我想对internationalsArray进行排序,并根据internationalsArray对其他排序,这样我会得到:

codesArraySorted = [ "en-GB",  "en_US", "de_DE", "es_ES"]
localesArraySorted = [ "English UK",  "English", "Deutsch",  "Español"]
internationalsArraySorted = ["British English", "English", "German", "Spanish"]

我尝试了sort()isOrderedBefore,但没有成功。

你能给我一个想法吗?

非常感谢!

【问题讨论】:

  • 创建一个结构来保存您的信息(每个国家/地区)以将 en-GB 与英语英国分组,然后对该数组进行排序。为什么需要管理三个独立的数组?
  • 谢谢 Oliver,我需要保留数组才能使用一些内置方法和库...它不适用于结构或字典...
  • 你总是可以映射一个结构数组来获得一个只包含相关信息的新数组。

标签: swift sorting


【解决方案1】:

您应该将此信息放入自定义结构中。然后你可以把这个结构类型的实例放入一个数组中,并对数组进行排序:

struct Language {
    let code: String
    let locale: String
    let international: String
}

let languages = [
    Language(code: "de_DE", locale: "Deutsch", international: "German"),
    Language(code: "en_US", locale: "English", international: "English"),
    Language(code: "en-GB", locale: "English UK", international: "British English"),
    Language(code: "es_ES", locale: "Español", international: "Spanish")
]

let sorted = languages.sort { $0.international < $1.international }
print(sorted)

然后可以使用map方法提取原始信息:

let codesArraySorted = sorted.map { $0.code }
let localesArraySorted = sorted.map { $0.locale }
let internationalsArraySorted = sorted.map { $0.international }

【讨论】:

  • 谢谢,我实现这个答案,因为它是最容易理解的。
【解决方案2】:

首先,在 Swift 中,我们不应该在变量(或常量)的类型之后命名,所以:

let codes = ["de_DE", "en_US", "en-GB", "es_ES"]
let locales = ["Deutsch", "English", "English UK", "Español"]
let internationals = ["German", "English", "British English", "Spanish"]

现在让我们构建一个索引数组,看看应该如何对codes 进行排序

let indexes = codes.enumerate().sort { $0.element < $1.element }.map { $0.index }

indexes 数组包含[0, 2, 1, 3],该数组中的i-th 元素代表codes 应该拥有的i-th 的位置。

所以现在我们可以根据索引对每个数组进行排序

let sortedCodes = codes.enumerate().sort { indexes[$0.0] < indexes[$1.0] }.map { $0.element }
let sortedLocales = locales.enumerate().sort { indexes[$0.0] < indexes[$1.0] }.map { $0.element }
let sortedInternationals = internationals.enumerate().sort { indexes[$0.0] < indexes[$1.0] }.map { $0.element }

输出

sortedCodes // ["de_DE", "en-GB", "en_US", "es_ES"]
sortedLocales // ["Deutsch", "English UK", "English", "Español"]
sortedInternationals // ["German", "British English", "English", "Spanish"]

就是这样。

【讨论】:

  • 这就是我等待的方式! (在 Matlab 中多次使用)
【解决方案3】:

您可以使用 zip3 功能 https://gist.github.com/kristopherjohnson/04dbc470e17f67f836a2#file-zip-swift 如果您不想实现自己的结构或字典。

let codesArray = ["de_DE", "en_US", "en-GB", "es_ES"]
let localesArray = ["Deutsch", "English", "English UK", "Español"]
let internationalsArray = ["German", "English", "British English", "Spanish"]

let combined = zip3(internationalsArray, b: localesArray, c: codesArray).sort {$0.0 < $1.0}

// use map to extract the individual arrays
let internationalsArraySorted = combined.map {$0.0}
let localesArraySorted = combined.map {$0.1}
let codesArraySorted = combined.map {$0.2}

print(internationalsArraySorted)  // "["British English", "English", "German", "Spanish"]\n"
print(localesArraySorted)  // "["English UK", "English", "Deutsch", "Español"]\n"
print(codesArraySorted)  // "["en-GB", "en_US", "de_DE", "es_ES"]\n"

【讨论】:

  • 谢谢,但由于缺乏文档,我并没有完全理解这个 zip3 功能。也许这是其他语言中众所周知的功能
  • Zip 也包含在 Swift 中。 swiftdoc.org/v2.2/func/zip。它告诉所有数组的第一个元素是相关的,如 de_DE,Deutsch 和 German 是一个组件。它用于通过一行代码准确解决您想要解决的问题。它是一种类型函数范式。
  • 看起来像是将多个数组组合成一个结构,有趣!
  • 是的,它是一种解决问题的实用方法。其他两个答案也一样。
【解决方案4】:

这是另一种避免多次排序的方法,如果您愿意,还允许您更新原始变量:

var codes = ["de_DE", "en_US", "en-GB", "es_ES"]
var locales = ["Deutsch", "English", "English UK", "Español"]
var internationals = ["German", "English", "British English", "Spanish"]

(codes,locales,internationals) = {( $0.map{codes[$0]}, 
                                    $0.map{locales[$0]}, 
                                    $0.map{internationals[$0]} 
                                 )} 
(codes.enumerated().sorted{$0.1<$1.1}.map{$0.0}) 

[编辑] 您可能还想查看此答案: https://stackoverflow.com/a/35274250/5237560 以获得更优雅的符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多