TimeZone.knownTimeZoneIdentifiers 的高效数据结构? [英] Efficient Data Structure for 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屋!