如何在Rascal中找到地图的最大值?

时间:2016-12-14 14:41:51

标签: rascal

我有map[str, int],需要在地图中找到最大int值。 是否可以将地图的所有值作为列表,然后执行max(list)? 或类似的东西..

1 个答案:

答案 0 :(得分:0)

您可以通过几种不同的方式获取值。作为参考,请说我们有以下地图:

rascal>map[str words, int counts] m =  ( "word1" : 3, "word2" : 10, "word3" : 4, "word4" : 10);
map[str words, int counts]: ("word1":3,"word2":10,"word3":4,"word4":10)

您可以将其视为保留文字及其在文档中出现的频率。现在有几种方法可以取回价值。由于我们在声明m(分别为wordscounts的类型)时给了域和范围两个名称,我们可以使用这些名称来获取值。例如:

rascal>m.words;
set[str]: {"word1","word2","word3","word4"}

取回钥匙,同时:

rascal>m.counts;
set[int]: {10,3,4}

获取值。您也可以使用"投影"符号,突出键或值,如下:

rascal>m<0>;
set[str]: {"word1","word2","word3","word4"}
rascal>m<1>;
set[int]: {10,3,4}

即使我们没有在域中添加名称和类型范围,这也有效。第三个选项,即使我们不添加名称也可以使用,您可以使用Map库中的库函数:

rascal>import Map;
ok
rascal>domain(m);
set[str]: {"word1","word2","word3","word4"}
rascal>range(m);
set[int]: {10,3,4}

现在我们有了一个包含值的集合,您可以使用max库中的Set函数来查找最大数字:

rascal>import Set;
ok
rascal>max(m.counts);
int: 10

如果您真正想要的是具有此值的键或键,您现在有不同的选项。 Map库包含一个名为invert的函数,它将&#34;翻转&#34;键和值。由于您可以使用具有相同值的多个键,因此实际上会为您提供从值到具有此值的所有键的映射。在我们的例子中,这看起来像这样:

rascal>invert(m);
map[int, set[str]]: (
  10:{"word2","word4"},
  3:{"word1"},
  4:{"word3"}
)

因此,如果我们想要找回具有最大数值的单词,我们可以执行以下操作:

rascal>invert(m)[max(m.counts)];
set[str]: {"word2","word4"}