我有字符串的映射,它看起来像这样:
var networks= {
'62':'n1',
'75,74,76,73':'n2',
'71,65,66':'n3',
'78':'n4'
};
我有字符串'0776556688'
,我想看看第三位和第四位是否与任何键匹配。
返回false:networks.containsKey(p.substring(2,4));
,但76
是一个密钥。
我怎样才能使这个回报成真?
76
不是密钥'75,74,76,73'
是密钥。
你可以这样做:
var networks= {
'62':'n1',
'75':'n2',
'74':'n2',
'76':'n2',
'73':'n2',
'71':'n3',
'65':'n3',
'66':'n3',
'78':'n4'
};
你也可以这样做:
var networks= {
for (final k1 in ['62'])
k1: 'n1',
for (final k2 in ['75', '74', '76', '73'])
k2: 'n2',
for (final k3 in ['71', '65', '66'])
k3: 'n3',
for (final k4 in ['78'])
k4: 'n4',
};
extension on Map<String,String> {
bool isInKey(String value) {
final index = keys.toList().indexWhere((k) => k.contains(value));
return index >= 0;
}
}
void main() {
final networks= {
'62':'n1',
'75,74,76,73':'n2',
'71,65,66':'n3',
'78':'n4'
};
var p = '0776556688';
print(networks.isInKey(p.substring(2,4)));
print(networks.isInKey('99'));
}
结果:
true
false
注意:
建议结构:
final net = {
'n1': [62],
'n2': [75,74,76,73],
'n3': [71,65,66],
'n4': [78]
};
我会对Map
进行预处理,将其转换为一个扩展版本,该扩展版本的密钥是原始密钥的预期子字符串。也就是说,从mmcdon20的答案生成Map
:
Map<String, String> expandKeys(Map<String, String> map) {
return <String, String>{
for (var entry in map.entries)
for (var key in entry.key.split(',')) key: entry.value,
};
}
var networks = expandKeys({
'62': 'n1',
'75,74,76,73': 'n2',
'71,65,66': 'n3',
'78': 'n4',
});
然后可以直接在networks
(例如networks.containsKey(p.substring(2,4))
(上高效地进行查找。