TimeZone.knownTimeZoneIdentifiers 的高效数据结构? [英] Efficient Data Structure for TimeZone.knownTimeZoneIdentifiers?

查看:51
本文介绍了TimeZone.knownTimeZoneIdentifiers 的高效数据结构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个从 TimeZone.knownTimeZoneIdentifiers 返回的字符串数组,我想将其解析为嵌套字典(或其他数据结构).

I have an array of Strings returned from TimeZone.knownTimeZoneIdentifiers that I would like to parse into a nested dictionary (or another data structure).

[String] 的格式为

[非洲/阿比让"、非洲/阿克拉"、..、美国/阿拉瓜伊纳"、美国/阿根廷/布宜诺斯艾利斯"、...、太平洋/马克萨斯"、太平洋/中途岛"、太平洋/瑙鲁"]

["Africa/Abidjan", "Africa/Accra",..,"America/Araguaina","America/Argentina/Buenos_Aires", ...,"Pacific/Marquesas", "Pacific/Midway", "Pacific/Nauru"]

最终的结果是这样的

["Africa":["Abidjan":[], "Accra":[]], "America": ["Araguaina": [], "Argentina": ["Buenos_Aires"]], "Pacific": ["Marquesas":[], "Midway":[], "Nauru":[]]]

我需要查询字典每一层的所有键.

I will need to query all of the keys at each level of the dictionary.

必须有另一种方法来执行此功能或使用递归,而不是 split(seperator: "/") 和几个 for 循环来手动构建数据结构.

There must be another way to do this functionally or with recursion, rather than split(seperator: "/") and several for loops to build the data structure manually.

推荐答案

不要为此使用字典.制作自定义类型.特别是,您正在描述一棵.让我们做一个(主要基于 https://github.com/raywenderlich/swift-algorithm-club/tree/master/Tree,如果还有更多需要做的,请修改 Node 类本身以满足您的需要):

Don't use a dictionary for this. Make a custom type. In particular, you are describing a tree. Let's make one (largely based on https://github.com/raywenderlich/swift-algorithm-club/tree/master/Tree, and if there is more that you need to do, modify the Node class itself to meet your needs):

class Node<T> {
    var value: T
    weak var parent: Node?
    var children = [Node<T>]()
    init(_ value: T) {
        self.value = value
    }
    func add(_ node: Node<T>) {
        children.append(node)
        node.parent = self
    }
}

现在是微不足道的:

let ids = TimeZone.knownTimeZoneIdentifiers
let root = Node("")
for id in ids {
    var node = root
    let splits = id.split(separator: "/").map(String.init)
    for split in splits {
        if let child = node.children.first(where:{$0.value == split}) {
            node = child
        } else {
            let newnode = Node(split)
            node.add(newnode)
            node = newnode
        }
    }
}

好的,让我们看看我们有什么.有一种打印节点的好方法会很有用:

Okay, let's see what we've got. It will be useful to have a nice way of printing a node:

extension Node: CustomStringConvertible {
    private func display(level:Int) -> String {
        let offset = String(repeating: " ", count: level * 4)
        var s = offset + String(describing: value)
        if children.isEmpty { return s }
        s += " {\n"
        s += children.map { $0.display(level:level+1) }.joined(separator: ",\n")
        s += "\n\(offset)}"
        return s
    }
    var description: String { return display(level:0) }
}

现在:

root.children.forEach {print($0)}

结果:

Africa {
    Abidjan,
    Accra,
    Addis_Ababa,
    Algiers,
    Asmara,
    Bamako,
    Bangui,
    Banjul,
    Bissau,
    Blantyre,
    Brazzaville,
    Bujumbura,
    Cairo,
    Casablanca,
    Ceuta,
    Conakry,
    Dakar,
    Dar_es_Salaam,
    Djibouti,
    Douala,
    El_Aaiun,
    Freetown,
    Gaborone,
    Harare,
    Johannesburg,
    Juba,
    Kampala,
    Khartoum,
    Kigali,
    Kinshasa,
    Lagos,
    Libreville,
    Lome,
    Luanda,
    Lubumbashi,
    Lusaka,
    Malabo,
    Maputo,
    Maseru,
    Mbabane,
    Mogadishu,
    Monrovia,
    Nairobi,
    Ndjamena,
    Niamey,
    Nouakchott,
    Ouagadougou,
    Porto-Novo,
    Sao_Tome,
    Tripoli,
    Tunis,
    Windhoek
}
America {
    Adak,
    Anchorage,
    Anguilla,
    Antigua,
    Araguaina,
    Argentina {
        Buenos_Aires,
        Catamarca,
        Cordoba,
        Jujuy,
        La_Rioja,
        Mendoza,
        Rio_Gallegos,
        Salta,
        San_Juan,
        San_Luis,
        Tucuman,
        Ushuaia
    },
    Aruba,
    Asuncion,
    Atikokan,
    Bahia,
    Bahia_Banderas,
    Barbados,
    Belem,
    Belize,
    Blanc-Sablon,
    Boa_Vista,
    Bogota,
    Boise,
    Cambridge_Bay,
    Campo_Grande,
    Cancun,
    Caracas,
    Cayenne,
    Cayman,
    Chicago,
    Chihuahua,
    Costa_Rica,
    Creston,
    Cuiaba,
    Curacao,
    Danmarkshavn,
    Dawson,
    Dawson_Creek,
    Denver,
    Detroit,
    Dominica,
    Edmonton,
    Eirunepe,
    El_Salvador,
    Fort_Nelson,
    Fortaleza,
    Glace_Bay,
    Godthab,
    Goose_Bay,
    Grand_Turk,
    Grenada,
    Guadeloupe,
    Guatemala,
    Guayaquil,
    Guyana,
    Halifax,
    Havana,
    Hermosillo,
    Indiana {
        Indianapolis,
        Knox,
        Marengo,
        Petersburg,
        Tell_City,
        Vevay,
        Vincennes,
        Winamac
    },
    Inuvik,
    Iqaluit,
    Jamaica,
    Juneau,
    Kentucky {
        Louisville,
        Monticello
    },
    Kralendijk,
    La_Paz,
    Lima,
    Los_Angeles,
    Lower_Princes,
    Maceio,
    Managua,
    Manaus,
    Marigot,
    Martinique,
    Matamoros,
    Mazatlan,
    Menominee,
    Merida,
    Metlakatla,
    Mexico_City,
    Miquelon,
    Moncton,
    Monterrey,
    Montevideo,
    Montreal,
    Montserrat,
    Nassau,
    New_York,
    Nipigon,
    Nome,
    Noronha,
    North_Dakota {
        Beulah,
        Center,
        New_Salem
    },
    Nuuk,
    Ojinaga,
    Panama,
    Pangnirtung,
    Paramaribo,
    Phoenix,
    Port-au-Prince,
    Port_of_Spain,
    Porto_Velho,
    Puerto_Rico,
    Punta_Arenas,
    Rainy_River,
    Rankin_Inlet,
    Recife,
    Regina,
    Resolute,
    Rio_Branco,
    Santa_Isabel,
    Santarem,
    Santiago,
    Santo_Domingo,
    Sao_Paulo,
    Scoresbysund,
    Shiprock,
    Sitka,
    St_Barthelemy,
    St_Johns,
    St_Kitts,
    St_Lucia,
    St_Thomas,
    St_Vincent,
    Swift_Current,
    Tegucigalpa,
    Thule,
    Thunder_Bay,
    Tijuana,
    Toronto,
    Tortola,
    Vancouver,
    Whitehorse,
    Winnipeg,
    Yakutat,
    Yellowknife
}
Antarctica {
    Casey,
    Davis,
    DumontDUrville,
    Macquarie,
    Mawson,
    McMurdo,
    Palmer,
    Rothera,
    South_Pole,
    Syowa,
    Troll,
    Vostok
}
Arctic {
    Longyearbyen
}
Asia {
    Aden,
    Almaty,
    Amman,
    Anadyr,
    Aqtau,
    Aqtobe,
    Ashgabat,
    Atyrau,
    Baghdad,
    Bahrain,
    Baku,
    Bangkok,
    Barnaul,
    Beirut,
    Bishkek,
    Brunei,
    Calcutta,
    Chita,
    Choibalsan,
    Chongqing,
    Colombo,
    Damascus,
    Dhaka,
    Dili,
    Dubai,
    Dushanbe,
    Famagusta,
    Gaza,
    Harbin,
    Hebron,
    Ho_Chi_Minh,
    Hong_Kong,
    Hovd,
    Irkutsk,
    Jakarta,
    Jayapura,
    Jerusalem,
    Kabul,
    Kamchatka,
    Karachi,
    Kashgar,
    Kathmandu,
    Katmandu,
    Khandyga,
    Krasnoyarsk,
    Kuala_Lumpur,
    Kuching,
    Kuwait,
    Macau,
    Magadan,
    Makassar,
    Manila,
    Muscat,
    Nicosia,
    Novokuznetsk,
    Novosibirsk,
    Omsk,
    Oral,
    Phnom_Penh,
    Pontianak,
    Pyongyang,
    Qatar,
    Qostanay,
    Qyzylorda,
    Rangoon,
    Riyadh,
    Sakhalin,
    Samarkand,
    Seoul,
    Shanghai,
    Singapore,
    Srednekolymsk,
    Taipei,
    Tashkent,
    Tbilisi,
    Tehran,
    Thimphu,
    Tokyo,
    Tomsk,
    Ulaanbaatar,
    Urumqi,
    Ust-Nera,
    Vientiane,
    Vladivostok,
    Yakutsk,
    Yangon,
    Yekaterinburg,
    Yerevan
}
Atlantic {
    Azores,
    Bermuda,
    Canary,
    Cape_Verde,
    Faroe,
    Madeira,
    Reykjavik,
    South_Georgia,
    St_Helena,
    Stanley
}
Australia {
    Adelaide,
    Brisbane,
    Broken_Hill,
    Currie,
    Darwin,
    Eucla,
    Hobart,
    Lindeman,
    Lord_Howe,
    Melbourne,
    Perth,
    Sydney
}
Europe {
    Amsterdam,
    Andorra,
    Astrakhan,
    Athens,
    Belgrade,
    Berlin,
    Bratislava,
    Brussels,
    Bucharest,
    Budapest,
    Busingen,
    Chisinau,
    Copenhagen,
    Dublin,
    Gibraltar,
    Guernsey,
    Helsinki,
    Isle_of_Man,
    Istanbul,
    Jersey,
    Kaliningrad,
    Kiev,
    Kirov,
    Lisbon,
    Ljubljana,
    London,
    Luxembourg,
    Madrid,
    Malta,
    Mariehamn,
    Minsk,
    Monaco,
    Moscow,
    Oslo,
    Paris,
    Podgorica,
    Prague,
    Riga,
    Rome,
    Samara,
    San_Marino,
    Sarajevo,
    Saratov,
    Simferopol,
    Skopje,
    Sofia,
    Stockholm,
    Tallinn,
    Tirane,
    Ulyanovsk,
    Uzhgorod,
    Vaduz,
    Vatican,
    Vienna,
    Vilnius,
    Volgograd,
    Warsaw,
    Zagreb,
    Zaporozhye,
    Zurich
}
GMT
Indian {
    Antananarivo,
    Chagos,
    Christmas,
    Cocos,
    Comoro,
    Kerguelen,
    Mahe,
    Maldives,
    Mauritius,
    Mayotte,
    Reunion
}
Pacific {
    Apia,
    Auckland,
    Bougainville,
    Chatham,
    Chuuk,
    Easter,
    Efate,
    Enderbury,
    Fakaofo,
    Fiji,
    Funafuti,
    Galapagos,
    Gambier,
    Guadalcanal,
    Guam,
    Honolulu,
    Johnston,
    Kiritimati,
    Kosrae,
    Kwajalein,
    Majuro,
    Marquesas,
    Midway,
    Nauru,
    Niue,
    Norfolk,
    Noumea,
    Pago_Pago,
    Palau,
    Pitcairn,
    Pohnpei,
    Ponape,
    Port_Moresby,
    Rarotonga,
    Saipan,
    Tahiti,
    Tarawa,
    Tongatapu,
    Truk,
    Wake,
    Wallis
}

这篇关于TimeZone.knownTimeZoneIdentifiers 的高效数据结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆