使用scala中的map转换Map

时间:2018-02-21 13:02:46

标签: scala

给定一个字符串我想创建一个映射,对于字符串中的每个字符,它将给出字符在字符串中出现的次数。以下函数生成从字符到字符串列表的映射。

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)
}

但它不起作用,有人可以解释为什么以及如何解决它?

2 个答案:

答案 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的视频),讨论了这一点以及其他功能。