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

How do I find the maximum value of a map in Rascal?

我有一个 map[str, int],需要在地图中找到最大的 int 值。 有没有可能把一个map的所有值都做成一个列表,然后做max(list)? 或者类似的..

您可以通过几种不同的方式取回这些值。作为参考,假设我们有以下地图:

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}

取回值。您还可以使用 "projection" 表示法,突出键或值,如下所示:

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}

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

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

如果您真正想要的是具有此值的一个或多个键,您现在有不同的选择。 Map 库包含一个名为 invert 的函数,它将 "flip" 键和值。由于您可以拥有多个具有相同值的键,这实际上为您提供了一个从该值到具有该值的所有键的映射。在我们的例子中,它看起来像这样:

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

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

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