给定一个字符串我想创建一个映射,对于字符串中的每个字符,它将给出字符在字符串中出现的次数。以下函数生成从字符到字符串列表的映射。
namespace BassinExpertV1
{
public sealed partial class MainPage : Page
{
PCF8591 ADConverter;
DispatcherTimer dispatcherTimer;
DispatcherTimer NiveauTimer;
public MainPage()
{
//Create Timer Date
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += DispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
//Create Timer water level
NiveauTimer = new DispatcherTimer();
NiveauTimer.Tick += NiveauTimer_Tick;
NiveauTimer.Interval = new TimeSpan(0, 0, 1);
this.InitializeComponent();
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
dispatcherTimer.Start(); //Timer Date
NiveauTimer.Start(); //Timer water level
}
//----------------------------------------------------------------------------
// Timer Date
//----------------------------------------------------------------------------
private void DispatcherTimer_Tick(object sender, object e)
{
DateHeure.Text = DateTime.Now.ToString();
}
//----------------------------------------------------------------------------
// Timer WaterLevel
//----------------------------------------------------------------------------
private async void NiveauTimer_Tick(object sender, object e)
{
RecupNiveauAsync();
await System.Threading.Tasks.Task.Delay(2000); //wait for 2 seconds (= 2000ms)
try
{
double value = ADConverter.ReadI2CAnalog_AsDouble(PCF8591_AnalogPin.A0) *5 + 95; // Conversion du la valeur du potentiomètre
value = Math.Round(value, 2, MidpointRounding.AwayFromZero); //Arrondir la valeur
TextBoxNiveau.Text = Convert.ToString(value) + " %"; // Afficher dans la Textbox la valeur du potentiomètre en %
}
catch
{
MessageDialog msg = new MessageDialog("Probleme");
await msg.ShowAsync();
}
}
//----------------------------------------------------------------------------
// Water Level conversion //----------------------------------------------------------------------------
private async System.Threading.Tasks.Task RecupNiveauAsync()
{
ADConverter = await PCF8591.Create();
}
//----------------------------------------------------------------------------
// Bouton automatique
//----------------------------------------------------------------------------
private void Automatique_Click(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(Automatique), null); //navigation vers la page automatique
}
//----------------------------------------------------------------------------
// Bouton manuel
//----------------------------------------------------------------------------
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(Manuel)); //navigation vers la page manuel
}
private void TextBlock_SelectionChanged(object sender, RoutedEventArgs e)
{
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
}
}
}
现在我想把最后一行改为:
def wordOccurrences(w: String) = {
val lower = w.toLowerCase.toList
lower.groupBy(t => t)
}
但它不起作用,有人可以解释为什么以及如何解决它?
答案 0 :(得分:2)
您可以使用
lower.groupBy(t => t).mapValues(_.length)
答案 1 :(得分:2)
对于map
ping目的,Map[K, V]
是Iterable[(K, V)]
(注意额外的一对括号,标识元组类型),这意味着当你map
超过它时你已经传递了一个从(K, V)
到目标类型的函数。
然而,你正在做的是传递一个函数,它接受两个独立的参数,而不是单个元组参数。
通过检查Scala shell中这两个函数的类型可以看出差异:
scala> :t (a: Int, b: Int) => a + b
(Int, Int) => Int
scala> :t (p: (Int, Int)) => p._1 + p._2
((Int, Int)) => Int
注意前者如何采用两个参数,而后者采用单个元组。
你可以做的是传递一个分解元组的函数,这样你就可以独立地绑定元组的组件:
lower.groupBy(t => t) map { case (x, y) => x -> y.length }
或者传递一个使用元组而不解构它的函数
lower.groupBy(t => t) map (p => p._1 -> p._2.length)
Dotty,这是Scala的原作者Martin Odersky正在开发的当前项目,它可能会成为Scala 3,支持你提出的语法,称为功能arity adaptation 。在Odersky 2016年Scala eXchange主题演讲中,“从DOT到Dotty”(here录制了2017年Voxxed Days CERN的视频),讨论了这一点以及其他功能。