加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的模式匹配元组

发布时间:2020-12-16 09:49:46 所属栏目:安全 来源:网络整理
导读:试图在这里处理模式匹配 – 来自C / Java背景,这对我来说非常陌生. 这个分支的要点是检查元组列表d的每个成员[格式为(字符串,对象).我想定义三个案例. 1)如果此函数中的计数器大于列表的大小(在另一个名为acc中定义),我想什么都不返回(因为没有匹配) 2)如果
试图在这里处理模式匹配 – 来自C / Java背景,这对我来说非常陌生.

这个分支的要点是检查元组列表d的每个成员[格式为(字符串,对象).我想定义三个案例.

1)如果此函数中的计数器大于列表的大小(在另一个名为acc中定义),我想什么都不返回(因为没有匹配)
2)如果输入中给出的键与列表中的元组匹配,我想返回其值(或者,存储在元组中的任何内容.).
3)如果没有匹配,则还有更多列表要迭代,递增并继续.

我的代码如下:

def get(key:String):Option[Any] = {

        var counter: Int = 0
        val flag: Boolean = false 

        x match {

                case (counter > acc) => None

                case ((d(counter)._1) == key) => d(counter)._2

                case _ =>   counter += 1
                }

我的问题是,第一种情况似乎正确编译,第二种情况引发错误:

:36: error: ')' expected but '.' found.
                case ((d(counter)._1) == key) => d(counter)._2

第三个也是:

scala>         case _ =>  counter += 1
:1: error: illegal start of definition

但我认为这是因为第二个不正确.我的第一个想法是我没有正确地比较元组,但我似乎遵循索引到元组的语法,所以我很难过.任何人都可以引导我朝着正确的方向前进吗?

解决方法

希望有一些事情可以解决你的困惑:

scala中的匹配遵循以下通用模板:

x match {
  case SomethingThatXIs if(SomeCondition) => SomeExpression
  // rinse and repeat
  // note that `if(SomeCondition)` is optional
}

看起来你可能试图使用匹配/ case表达式作为if / else if / else类型的更多块,并且据我所知,x在所述块中并不重要.如果是这样的话,你可能会喜欢这样的事情

case _ if (d(counter)._1 == key) => d(counter)._2

关于scala列表的一些信息.您应该始终将其视为LinkedList,其中索引查找是O(n)操作.列表可以与head :: tail格式匹配,Nil是一个空列表.例如:

val myList = List(1,2,3,4)
myList match {
  case first :: theRest => 
    // first is 1,theRest is List(2,4),which you can also express as
    // 2 :: 3 :: 4 :: Nil
  case Nil =>
    // an empty list case
}

看起来你正在构建一种ListMap,所以我会写一个更“实用”/“递归”的方法来实现你的get方法.

我假设d是类型为List [(String,Any)]的后备列表

def get(key: String): Option[Any] = {
  def recurse(key: String,list: List[(String,Any)]): Option[Any] = list match {
    case (k,value) :: _ if (key == k) => Some(value)
    case _ :: theRest => recurse(key,theRest)
    case Nil => None
  }
  recurse(key,d)
}

三个案例陈述可以解释如下:

1)列表中的第一个元素是(k,value)的元组.列表的其余部分与_匹配,因为在这种情况下我们不关心它.条件询问k是否等于我们正在寻找的键.在这种情况下,我们想要从元组返回值.

2)由于第一个元素没有正确的密钥,我们想要递归.我们不关心第一个元素,但是我们想要列表的其余部分,以便我们可以用它来递归.

3)case Nil表示列表中没有任何内容,应该标记“失败”和递归的结束.在这种情况下,我们返回None.考虑这与你的计数器相同>来自你问题的条件.

请不要犹豫,要求进一步解释;如果我不小心弄错了(不会编译等),请指出它,我会解决它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读