如果键是列表,则在Dart地图中搜索键

时间:2019-07-08 13:01:09

标签: dictionary dart

我正在解决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。

1 个答案:

答案 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*/];