如何在飞镖中匹配键的子串

  • 本文关键字:子串 飞镖 dart
  • 更新时间 :
  • 英文 :


我有字符串的映射,它看起来像这样:

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))(上高效地进行查找。

相关内容

最新更新