课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据结构是程序员在学习计算机编程开发技术需要重点掌握的一个编程知识,下面我们就通过案例分析来了解一下,数据机构模式都有哪些类型。
1)常量模式(constantpatterns)包含常量变量和常量字面量
scala>valsite=“#”
scala>sitematch{case“#”=>println(“ok”)}
scala>valALIBABA=”#”
scala>deffoo(s:String){smatch{caseALIBABA=>println(“ok”)}}//注意这里常量必须以大写字母开头
常量模式和普通的if比较两个对象是否相等(equals)没有区别,并没有感觉到什么威力
2)变量模式(variablepatterns)
确切的说单纯的变量模式没有匹配判断的过程,只是把传入的对象给起了一个新的变量名。
scala>sitematch{casewhateverName=>println(whateverName)}
上面把要匹配的site对象用whateverName变量名代替,所以它总会匹配成功。
不过这里有个约定,对于变量,要求必须是以小写字母开头,否则会把它对待成一个常量变量,
比如上面的whateverName如果写成WhateverName就会去找这个WhateverName的变量,如果找到则比较相等性,找不到则出错。
变量模式通常不会单独使用,而是在多种模式组合时使用,比如List(1,2)match{caseList(x,2)=>println(x)}
里面的x就是对匹配到的一个元素用变量x标记。
3)通配符模式(wildcardpatterns)
通配符用下划线表示:”_”,可以理解成一个特殊的变量或占位符。
单纯的通配符模式通常在模式匹配的后一行出现,case_=>它可以匹配任何对象,用于处理所有其它匹配不成功的情况。
通配符模式也常和其他模式组合使用:
scala>List(1,2,3)match{caseList(_,_,3)=>println(“ok”)}
上面的List(_,_,3)里用了2个通配符表示一个和二个元素,这2个元素可以是任意类型
通配符通常用于代表所不关心的部分,它不像变量模式可以后续的逻辑中使用这个变量。
4)构造器模式(constructorpatterns)
这个是真正能体现模式匹配威力的一个模式!
我们来定义一个二叉树:
scala>:paste
//Enteringpastemode(ctrl-Dtofinish)
traitNode//抽象节点
caseclassTreeNode(v:String,left:Node,right:Node)extendsNode//具体的节点实现,有两个子节点
caseclassTree(root:TreeNode)//Tree,构造参数是根节点
//Exitingpastemode,nowinterpreting.
这样我们构造一个根节点含有2个子节点的数:
scala>valtree=Tree(TreeNode(“root”,TreeNode(“left”,null,null),TreeNode(“right”,null,null)))
如果我们期望一个树的构成是根节点的左子节点值为”left”,右子节点值为”right”并且右子节点没有子节点
那么可以用下面的方式匹配:
scala>tree.rootmatch{caseTreeNode(_,TreeNode(“left”,_,_),TreeNode(“right”,null,null))=>println(“bingo”)}
只要一行代码就可以很清楚的描述,如果用java实现,是不是没这么直观呢?
5)类型模式(typepatterns)
类型模式很简单,就是判断对象是否是某种类型:
scala>“hello”match{case_:String=>println(“ok”)}
跟isInstanceOf判断类型的效果一样,需要注意的是scala匹配泛型时要注意,
比如
scala>deffoo(a:Any){amatch{casea:List[String]=>println(“ok”);case_=>}}
如果使用了泛型,它会被擦拭掉,如同java的做法,所以上面的List[String]里的String运行时并不能检测
foo(List(“A”))和foo(List(2))都可以匹配成功。实际上上面的语句编译时就会给出警告,但并不出错。
通常对于泛型直接用通配符替代,上面的写为casea:List[_]=>…
6)变量绑定模式(variablebindingpatterns)
这个和前边的变量模式有什么不同?看一下代码就清楚了:
依然是上面的TreeNode,如果我们希望匹配到左边节点值为”left”就返回这个节点的话:
scala>tree.rootmatch{caseTreeNode(_,leftNode@TreeNode(“left”,_,_),_)=>leftNode}
用@符号绑定leftNode变量到匹配到的左节点上,只有匹配成功才会绑定
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。