我正在解决Dart网站“ exercism.io”上的问题。Link to problem statement 我正在使用map作为数据结构,关键数据类型是List。 当我尝试访问地图时会出现问题,我很困惑如何在列表中搜索该键。
我尝试在不同的平台(如休闲装)上询问,但没有任何帮助。另外,我尝试搜索类似的问题,但不幸的是,由于Dart是一种新语言,因此没有太多了。
int score(String str) {
int score;
//Map declaration and definition
Map<List<String>, int> scrabbleDat = {
//list as a key and int as a value
['A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T']: 1,
['D', 'G']: 2,
['B', 'C', 'M', 'P']: 3,
['F', 'H', 'V', 'W', 'Y']: 4,
['K']: 5,
['J', 'X']: 8,
['Q', 'Z']: 10
};
for (int i = 0; i < str.length; ++i) {
//Trying to access map based on the str parameter
//Adding the value returned to score variable
score += scrabbleDat[str[i]];
}
return score; // returning the score
}
代码可以正常运行,但是任何字符串获得的输出都是null。
答案 0 :(得分:1)
您想要的是一个映射,其中多个键映射到相同的值。
使用值列表作为键不能让您有效地查找。您可以线性搜索键,然后依次搜索各个列表,直到找到所需的键,但您并未将地图用作 Map
。
我会构建地图,以便将每个键直接映射到其值:
Map<String, int> map = {};
void _addAll(List<String> keys, int value) {
for (var key in keys) map[key] = value;
}
_addAll(['A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T'], 1);
_addAll(['D', 'G'], 2);
_addAll(['B', 'C', 'M', 'P'], 3);
_addAll(['F', 'H', 'V', 'W', 'Y'], 4);
_addAll(['K'], 5); // or just: map['K'] = 5;
_addAll(['J', 'X'], 8);
_addAll(['Q', 'Z'], 10);
没有比简单地编写地图文字容易的多了
var map = {
'A': 1, 'B': 3, 'C': 3, 'D': 2, 'E': 1, 'F': 4, 'G': 2, 'H': 4,
'I': 1, 'J': 8, 'K': 5, 'L': 1, 'M': 3, 'N': 1, 'O': 1, 'P': 3,
'Q': 10, 'R': 1, 'S': 1, 'T': 1, 'U': 1, 'V': 4, 'W': 4, ,X': 8,
'Y': 4, 'Z': 10
};
此后,您的地图将初始化,您可以直接查找每个字母:
print(map['X']); // prints 8.
另一种选择是,由于您的键具有相应的ASCII值,因此 基于索引的表,并根据字母的ASCII值计算索引:
// A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
var table = [1,3,3,2,1,4,2,4,1,8,5,1,3,1,1,3,10,1,1,1,1,4,4,8,4,10];
int lookup(String letter) => table[letter.codeUnitAt(0) - 0x41 /*A*/];