scala 实现链表
在学习数据结构时学到了链表,因为日常工作,写java写多了,想换个语言玩下,就试着想用scala实现一个链表。哪到知道碰到很多问题,
这里记录下使用scala时,所遇到的那些坑。
java链表
首先,我们先使用java来实现一个链表最简单的链表
public static class Node<T> { /** * 这里为了方便,就不用get和set方法那一套了 */ public Node next; public T data; }
public static void main(String[] args) { Node<Integer> headNode = new Node<>(); headNode.data = 1; Node<Integer> secondNode = new Node<>(); secondNode.data = 2; headNode.next = secondNode; Node<Integer> thirdNode = new Node<>(); thirdNode.data = 3; secondNode.next = thirdNode; Node<Integer> fourthNode = new Node<>(); fourthNode.data = 4; thirdNode.next = fourthNode; Node<Integer> fifthNode = new Node<>(); fifthNode.data = 5; fourthNode.next = fifthNode; //遍历node Node<Integer> currentNode = headNode; while (currentNode != null) { System.out.println(currentNode.data); currentNode = currentNode.next; } }
代码很简单,就不解释了,我们使用java实现了如下的数组。
同样的代码,我们使用scala实现一遍。
scala链表
case class Node[E](var next: Node[E], var data: E) { } def main(args: Array[String]): Unit = { val headNode = Node(null, 1) val secondNode = Node(null, 2) headNode.next = secondNode val thirdNode = Node(null, 3) secondNode.next = thirdNode val fourthNode = Node(null, 4) thirdNode.next = fourthNode val fifthNode = Node(null, 5) fourthNode.next = fifthNode var currentNode = headNode while (currentNode != null) { println(currentNode.data) currentNode = currentNode.next } }
使用scala来实现链表也非常简单,除了预发以外基本上和java一模一样。
头部节点
好像从上面看,也没啥问题啊。考虑这样的情况,我们在实现一个链表时,经常会有一个设置一个不表示任何意义的头结点,以便于统一链表的操作(add和remove操作)
先来看看使用java如何创建这样一个“空节点”
public static class Node<T> { /** * 这里为了方便,就不用get和set方法那一套了 */ public Node next; public T data; } public static class List<T>{ private Node<T> headNode = new Node<>(); } public static void main(String[] args) { List<Integer> list = new List<>(); }
没啥问题
同样的代码,看看scala
报了个错,Type mismatch, expected:E actual:Null ,scala的泛型不止是用于引用类型。
看这个图可以知道,null仅仅是AnyRef的子类
,对于AnyVal这样的类型,比如Int,无法使用null赋值。
解决方法一:限制泛型的下界
即,限制泛型必须是Null的父类型
case class Node[E](var next: Node[E], var data: E) { } class List[E >: Null] { var headNode = new Node[E](null, null) } def main(args: Array[String]): Unit = { val l = new List[Integer] //问题,这里只能用Integer,无法使用Int了 }
这种方式,解决了无法使用null赋值的问题。但是使用这种方式,必须使用new List[Integer]
无法使用基本类型比如 new List[Int]
解决方法二:todo
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
百度Java面试题前200页和答案都在这里了
百度Java面试题前200页和答案都在这里了 其中题目来源github.com/tangyouhua/program-resource/blob/master/program-interview/java-baidu-200.md,答案我自己整理的。 有兴趣可以加入我QQ群 368614849(大型网站架构技术交流), 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fail-fast 与 fail-safe 机制有什么区别 get 和 post请求的区别 Interface 与 abstract 类的区别 IOC的优点是什么 IO 和 NIO的区别,NIO优点 Java 8 / Java 7 为我们提供了什么新功能 什么是竞态条件? 举个例子说明。 JRE、JDK、JVM 及 JIT 之间有什么不同 MVC的各个部分都有那些技术来实现?如何实现? RPC 通信和 RMI 区别 什么是 Web Service(Web服...
- 下一篇
告诉你,Spring Boot 真是个牛逼货!
现在 Spring Boot 非常火,各种技术文章,各种付费教程,多如牛毛,可能还有些不知道 Spring Boot 的,那它到底是什么呢?有什么用?今天给大家详细介绍一下。 Spring Boot 的背景 了解 Spring Boot 必须先说说 Spring 框架! 在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大。 用过 Spring 框架的都知道 Spring 能流行是因为它的两把利器:IOC 和 AOP,IOC 可以帮助我们管理对象的依赖关系,极大减少对象的耦合性,而 AOP 的切面编程功能可以更方面的使用动态代理来实现各种动态方法功能(如事务、缓存、日志等)。 而要集成 Spring 框架,必须要用到 XML 配置文件,或者注解式的 Java 代码配置。无论是使用 XML 或者代码配置方式,都需要对相关组件的配置有足够的了解,然后再编写大量冗长的配置代码。 然后又有多少开发人员能精通这些配置呢?如果我们只提供一些配置参数让框架能自动配置这些组件,那是不是 so easy? 基于简化 Sprin...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境