我如何在 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
类型时给了域和范围两个名称(分别为 words
和 counts
),我们可以使用这些名称取回值。例如:
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"}
我有一个 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
类型时给了域和范围两个名称(分别为 words
和 counts
),我们可以使用这些名称取回值。例如:
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"}