2016-12-14 61 views

回答

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的函数,该函数将“翻转”键和值。既然你可以有多个具有相同值的键,这实际上给你一个从该值到具有该值的所有键的映射。在我们的例子中,这看起来是这样的:

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

所以,如果我们想找回那种具有最大数值的话,我们可以做到以下几点:

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