Scala进阶之路-Scala中的Ordered--Ordering

                            作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

   说道对象的比较,在Java中大家最熟悉不过的就是实现类本身实现Comparable接口或者是调用者自己实现Comparator接口均可以实现对象之间的比较。在Scala中Ordered这个特质对应的是Comparable,而Odrering这个特质对应的是Comparator。好了,废话不多说,我们直接看案例吧。

一.Java中的Comparable--Comparator

1>.Java中的Comparator案例展示

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie; public class Teacher {
private String name;
private int age; public Teacher() {
} public Teacher(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

Teacher.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie; import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.ArrayList; public class APPComparator {
public static void main(String[] args) {
/**
* 丹尼斯·里奇,C语言之父,UNIX之父。曾担任朗讯科技公司贝尔实验室下属的计算机科学研究中心系统软件研究部的主任一
* 职。1978年与布莱恩·科尔尼干(Brian W. Kernighan)一起出版了名著《C程序设计语言(The C Programming Language)》,
* 现在此书已翻译成多种语言,成为C语言方面最权威的教材之一。2011年10月12日(北京时间为10月13日),丹尼斯·里奇去世,
* 享年70岁。
*/
Teacher t1 = new Teacher("丹尼斯·里奇", 70);
/**
* 林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds, 1969年~ ),著名的电脑程序员、黑客。
* Linux内核的发明人及该计划的合作者。托瓦兹利用个人时间及器材创造出了这套当今全球最流行的操作系统
* (作业系统)内核之一。现受聘于开放源代码开发实验室(OSDL:Open Source Development Labs, Inc),
* 全力开发Linux内核。
*/
Teacher t2 = new Teacher("Linus Benedict Torvalds", 49); /**
* 1982年,美国AT&T公司贝尔实验室的Bjarne Stroustrup博士在c语言的基础上引入并扩充了面向对象的概念,
* 发明了—种新的程序语言。为了表达该语言与c语言的渊源关系,它被命名为C++。
*/
Teacher t3 = new Teacher("Bjarne Stroustrup", 68); /**
* 1989年,他创立了Python语言。那时,他还在荷兰的CWI(Centrum voor Wiskunde en Informatica,国家
* 数学和计算机科学研究院)。1991年初,Python发布了第一个公开发行版。
*/
Teacher t4 = new Teacher("Guido van Rossum", 62);
/**
* 詹姆斯·高斯林 (James Gosling)是一名软件专家,1955年5月19日出生于加拿大,Java编程语言的共同创始人之一,
* 一般公认他为“Java之父”。在他12岁的时候,他已能设计电子游戏机,帮忙邻居修理收割机。大学时期在天文系担任程式开
* 发工读生,1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位。
*/
Teacher t5 = new Teacher("詹姆斯·高斯林", 63);
/**
* Martin Odersky是Typesafe的联合创始人,也是Scala编程语言的发明者,代表作品有《Programming in Scala》。
*/
Teacher t6 = new Teacher("Martin Odersky", 60);
/**
* Robert “ Rob ” C。Pike(生于1956年)是加拿大程序员和作家。他最出名的是他在Go(编程语言)和贝尔实验室的工作,
* 他是Unix团队的成员,参与了贝尔实验室和Inferno操作系统以及Limbo的Plan 9的创建。编程语言。他还共同开发了Unix 的Blit
* 图形终端; 在此之前,他在1981年为Unix编写了第一个窗口系统.Pike是AT&T的美国专利4,555,775中唯一的发明人,或者是
* “ 支持商店 专利 ”,它是X图形系统协议的一部分,也是最早的软件专利之一。多年来,派克写了很多文字编辑; sam和极致
* 是最知名的,仍然在积极使用和发展。
*/
Teacher t7 = new Teacher("Rob Pike", 62);
/**
* Rasmus Lerdorf(1968年11月22日出生)是丹麦裔加拿大人[1]的 程序员。他创建了PHP脚本语言,编写了该语言的前两个
* 版本,并参与了由一组开发人员领导的更高版本的开发,包括Jim Winstead(后来创建了blo.gs),Stig Bakken,Shane Caraveo,
* Andi Gutmans,和Zeev Suraski。他继续为该项目做出贡献。
*/
Teacher t8 = new Teacher("Rasmus Lerdorf", 50);
/**
* 布兰登·艾奇(Brendan Eich,1961年~),JavaScript的发明人,目前(2005年至2014年)在Mozilla公司担任首席
* 技术长(Chief Technology Officer)。出任Mozilla的CEO十天就被迫辞职。
*/
Teacher t9 = new Teacher("Brendan Eich", 50); List<Teacher> list = new ArrayList<Teacher>();
list.add(t1);
list.add(t2);
list.add(t3);
list.add(t4);
list.add(t5);
list.add(t6);
list.add(t7);
list.add(t8);
list.add(t9); //比较九个老师的年龄
Collections.sort(list, new Comparator<Teacher>() {
public int compare(Teacher o1, Teacher o2) {
return o1.getAge() - o2.getAge();
}
}); for (Teacher teacher : list) {
System.out.printf("Teacher Name = %s\n",teacher.getName());
}
}
} /*
以上代码执行结果如下:
Teacher Name = Linus Benedict Torvalds
Teacher Name = Rasmus Lerdorf
Teacher Name = Brendan Eich
Teacher Name = Martin Odersky
Teacher Name = Guido van Rossum
Teacher Name = Rob Pike
Teacher Name = 詹姆斯·高斯林
Teacher Name = Bjarne Stroustrup
Teacher Name = 丹尼斯·里奇
*/

2>.Java中的Comparator案例展示

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie; public class TeacherComparable implements Comparable<TeacherComparable>{
private String name;
private int age; public TeacherComparable() {
} public TeacherComparable(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public int compareTo(TeacherComparable o) {
return this.getAge() - o.getAge();
}
}

TeacherComparable.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class APPComparable {
public static void main(String[] args) {
/**
* 丹尼斯·里奇,C语言之父,UNIX之父。曾担任朗讯科技公司贝尔实验室下属的计算机科学研究中心系统软件研究部的主任一
* 职。1978年与布莱恩·科尔尼干(Brian W. Kernighan)一起出版了名著《C程序设计语言(The C Programming Language)》,
* 现在此书已翻译成多种语言,成为C语言方面最权威的教材之一。2011年10月12日(北京时间为10月13日),丹尼斯·里奇去世,
* 享年70岁。
*/
TeacherComparable t1 = new TeacherComparable("丹尼斯·里奇", 70);
/**
* 林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds, 1969年~ ),著名的电脑程序员、黑客。
* Linux内核的发明人及该计划的合作者。托瓦兹利用个人时间及器材创造出了这套当今全球最流行的操作系统
* (作业系统)内核之一。现受聘于开放源代码开发实验室(OSDL:Open Source Development Labs, Inc),
* 全力开发Linux内核。
*/
TeacherComparable t2 = new TeacherComparable("Linus Benedict Torvalds", 49); /**
* 1982年,美国AT&T公司贝尔实验室的Bjarne Stroustrup博士在c语言的基础上引入并扩充了面向对象的概念,
* 发明了—种新的程序语言。为了表达该语言与c语言的渊源关系,它被命名为C++。
*/
TeacherComparable t3 = new TeacherComparable("Bjarne Stroustrup", 68); /**
* 1989年,他创立了Python语言。那时,他还在荷兰的CWI(Centrum voor Wiskunde en Informatica,国家
* 数学和计算机科学研究院)。1991年初,Python发布了第一个公开发行版。
*/
TeacherComparable t4 = new TeacherComparable("Guido van Rossum", 62);
/**
* 詹姆斯·高斯林 (James Gosling)是一名软件专家,1955年5月19日出生于加拿大,Java编程语言的共同创始人之一,
* 一般公认他为“Java之父”。在他12岁的时候,他已能设计电子游戏机,帮忙邻居修理收割机。大学时期在天文系担任程式开
* 发工读生,1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位。
*/
TeacherComparable t5 = new TeacherComparable("詹姆斯·高斯林", 63);
/**
* Martin Odersky是Typesafe的联合创始人,也是Scala编程语言的发明者,代表作品有《Programming in Scala》。
*/
TeacherComparable t6 = new TeacherComparable("Martin Odersky", 60);
/**
* Robert “ Rob ” C。Pike(生于1956年)是加拿大程序员和作家。他最出名的是他在Go(编程语言)和贝尔实验室的工作,
* 他是Unix团队的成员,参与了贝尔实验室和Inferno操作系统以及Limbo的Plan 9的创建。编程语言。他还共同开发了Unix 的Blit
* 图形终端; 在此之前,他在1981年为Unix编写了第一个窗口系统.Pike是AT&T的美国专利4,555,775中唯一的发明人,或者是
* “ 支持商店 专利 ”,它是X图形系统协议的一部分,也是最早的软件专利之一。多年来,派克写了很多文字编辑; sam和极致
* 是最知名的,仍然在积极使用和发展。
*/
TeacherComparable t7 = new TeacherComparable("Rob Pike", 62);
/**
* Rasmus Lerdorf(1968年11月22日出生)是丹麦裔加拿大人[1]的 程序员。他创建了PHP脚本语言,编写了该语言的前两个
* 版本,并参与了由一组开发人员领导的更高版本的开发,包括Jim Winstead(后来创建了blo.gs),Stig Bakken,Shane Caraveo,
* Andi Gutmans,和Zeev Suraski。他继续为该项目做出贡献。
*/
TeacherComparable t8 = new TeacherComparable("Rasmus Lerdorf", 50);
/**
* 布兰登·艾奇(Brendan Eich,1961年~),JavaScript的发明人,目前(2005年至2014年)在Mozilla公司担任首席
* 技术长(Chief Technology Officer)。出任Mozilla的CEO十天就被迫辞职。
*/
TeacherComparable t9 = new TeacherComparable("Brendan Eich", 50); List<TeacherComparable> list = new ArrayList<TeacherComparable>();
list.add(t1);
list.add(t2);
list.add(t3);
list.add(t4);
list.add(t5);
list.add(t6);
list.add(t7);
list.add(t8);
list.add(t9); //使用 Collections.sort 来比较九个老师的年龄
Collections.sort(list); for (TeacherComparable teacher : list) {
System.out.printf("Teacher Name = %s\n",teacher.getName());
} }
} /*
以上代码执行结果如下:
Teacher Name = Linus Benedict Torvalds
Teacher Name = Rasmus Lerdorf
Teacher Name = Brendan Eich
Teacher Name = Martin Odersky
Teacher Name = Guido van Rossum
Teacher Name = Rob Pike
Teacher Name = 詹姆斯·高斯林
Teacher Name = Bjarne Stroustrup
Teacher Name = 丹尼斯·里奇
*/

二.Scala中的Ordered--Ordering

1>.Scala中的Ordered

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie /**
* <:  #表示的是Scala泛型中的上界,相当于Java泛型中的"<T extends Comparable>"
* TT<: Ordered[T] #表示T实现Ordered接口
*/
class ComparableGeneralObject[T<: Ordered[T]](a:T,b:T){
/**
* @return : 返回比较大的数值
*/
def bigger = {
if (a > b){
a
}else{
b
}
}
} /**
* 改类需要实现Ordered特质
*/
class TeacherOrdered(val name:String,val age:Int) extends Ordered[TeacherOrdered] {
/**
* 重写比较的方法,比较方法按照年龄来比较
*/
override def compare(that: TeacherOrdered): Int = {
this.age - that.age
}
/**
* 重写toString方法
*/
override def toString: String = {
this.name + "\t" + this.age
}
} object TeacherDemo{
def main(args: Array[String]): Unit = {
/**
* 丹尼斯·里奇,C语言之父,UNIX之父。曾担任朗讯科技公司贝尔实验室下属的计算机科学研究中心系统软件研究部的主任一
* 职。1978年与布莱恩·科尔尼干(Brian W. Kernighan)一起出版了名著《C程序设计语言(The C Programming Language)》,
* 现在此书已翻译成多种语言,成为C语言方面最权威的教材之一。2011年10月12日(北京时间为10月13日),丹尼斯·里奇去世,
* 享年70岁。
*/
val t1 = new TeacherOrdered("丹尼斯·里奇", 70)
/**
* 林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds, 1969年~ ),著名的电脑程序员、黑客。
* Linux内核的发明人及该计划的合作者。托瓦兹利用个人时间及器材创造出了这套当今全球最流行的操作系统
* (作业系统)内核之一。现受聘于开放源代码开发实验室(OSDL:Open Source Development Labs, Inc),
* 全力开发Linux内核。
*/
val t2 = new TeacherOrdered("Linus Benedict Torvalds", 49) val res1 = new ComparableGeneralObject(t1,t2)
println(res1.bigger)
}
} /*
以上代码执行结果如下:
丹尼斯·里奇 70
*/

2>.Scala中的Ordering

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie /**
* 上下文界定也会发生隐式转换,上下文界定是视图界定的语法糖
*/
class ComparableGeneralObject[T:Ordering](a:T,b:T){
/**
* @return : 返回比较大的数值
*/
def bigger:T = {
val comparator = implicitly[Ordering[T]]
if (comparator.compare(a,b) > 0 ){
a
}else{
b
}
}
} /**
* 改类需要实现Ordered特质
*/
class TeacherOrdering(val name:String,val age:Int) {
/**
* 重写toString方法
*/
override def toString: String = {
this.name + "\t" + this.age
}
} object TeacherDemo{
/**
* 隐式创建一个比较器Ordering
*/
implicit val comparator= new Ordering[TeacherOrdering]{
override def compare(x: TeacherOrdering, y: TeacherOrdering): Int = {
x.age - y.age
}
} def main(args: Array[String]): Unit = {
/**
* 丹尼斯·里奇,C语言之父,UNIX之父。曾担任朗讯科技公司贝尔实验室下属的计算机科学研究中心系统软件研究部的主任一
* 职。1978年与布莱恩·科尔尼干(Brian W. Kernighan)一起出版了名著《C程序设计语言(The C Programming Language)》,
* 现在此书已翻译成多种语言,成为C语言方面最权威的教材之一。2011年10月12日(北京时间为10月13日),丹尼斯·里奇去世,
* 享年70岁。
*/
val t1 = new TeacherOrdering("丹尼斯·里奇", 70)
/**
* 林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds, 1969年~ ),著名的电脑程序员、黑客。
* Linux内核的发明人及该计划的合作者。托瓦兹利用个人时间及器材创造出了这套当今全球最流行的操作系统
* (作业系统)内核之一。现受聘于开放源代码开发实验室(OSDL:Open Source Development Labs, Inc),
* 全力开发Linux内核。
*/
val t2 = new TeacherOrdering("Linus Benedict Torvalds", 49) /**
* 注意,由于比较的方法是由视图界定实现,因此它会自动调用隐式实现,即调用上面的“implicit def TeacherToOrderedTeacher(t:TeacherOrdered)...”函数签名。
*/
val res1 = new ComparableGeneralObject(t1,t2)
println(res1.bigger)
}
} /*
以上代码执行结果如下:
丹尼斯·里奇 70
*/

Scala进阶之路-Scala中的Ordered--Ordering的更多相关文章

  1. Scala进阶之路-Scala中的泛型介绍

    Scala进阶之路-Scala中的泛型介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 通俗的讲,比如需要定义一个函数,函数的参数可以接受任意类型.我们不可能一一列举所有的参数类 ...

  2. Scala进阶之路-Scala中的枚举用法案例展示

    Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ...

  3. Scala进阶之路-Scala中的高级类型

    Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...

  4. Scala进阶之路-Scala高级语法之隐式(implicit)详解

    Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...

  5. Scala进阶之路-Scala特征类与unapply反向抽取

    Scala进阶之路-Scala特征类与unapply反向抽取 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala特征类分析 1>.Unit 答:用于定义返回值类型, ...

  6. Scala进阶之路-Scala函数篇详解

    Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...

  7. Scala进阶之路-Scala的基本语法

    Scala进阶之路-Scala的基本语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数式编程初体验Spark-Shell之WordCount var arr=Array( ...

  8. Scala进阶之路-反射(reflect)技术详解

    Scala进阶之路-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的反射技术和Java反射用法类似,我这里就不一一介绍反射是啥了,如果对 ...

  9. Scala进阶之路-正则表达式案例

    Scala进阶之路-正则表达式案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 废话不多说,正则大家都很清楚,那在Scala如何使用正则了?我们直接上个案例,如下: /* @au ...

随机推荐

  1. 基于SSH框架的在线考勤系统开发的质量属性

    我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...

  2. ros-安装

    1.安装了ubuntu for ros. 运行评论下边那条命令: 2.rtabamp 3.准备安装机器人导航仿真系统:https://blog.csdn.net/wangchao7281/articl ...

  3. EL表达式和JSTL标签库

    expresion language表达式语言 可以输出表达式的值.跟jsp的表达式脚本一样.计算表达式的值后输出.  EL表达式出现的目的是为了使JSP写起来更加简单,让jsp的代码更佳简化. 1. ...

  4. eclipse webproject activiti

    https://stackoverflow.com/questions/42858723/activiti-eclipse-maven-project-to-dynamic-web-project-a ...

  5. PHP多进程编之pcntl_fork的实例详解

    PHP多进程编之pcntl_fork的实例详解 其实PHP是支持并发的,只是平时很少使用而已.平时使用最多的应该是使用PHP-FMP调度php进程了吧. 但是,PHP的使用并不局限于做Web,我们完全 ...

  6. [转帖]IBM POWER系列处理器的前世今生

    IBM POWER系列处理器的前世今生 Power是Power Optimization With Enhanced RISC的缩写,是由IBM开发的一种RISC指令集架构(ISA). IBM的很多服 ...

  7. linux 终端快捷操作

    终端一些常用快捷键 按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,jobs命令查看后台工作,命令&quo ...

  8. Fantacy团队周一站立会议

    词频分析模型 1.首先这次站会是周一开的,但是由于我个人的疏忽,没有落实到博客上,请见谅,连累了组长. 2.会议时间:2016年3月28日12:00~12:30. 持续时长:30分钟 会议参加成员:组 ...

  9. python数据统计量分析

    #-*- coding: utf-8 -*- #餐饮销量数据统计量分析 from __future__ import print_function import pandas as pd cateri ...

  10. 关于WrapPanel和RadioButton相互配合使用实WrapPanel现动态添加或删除项

    最近在做一个项目的时候,有一个需求就是,通过RadioButton来控制一行内容的显示与不显示,当不显示的时候,下面的项能够占住相应的位置,当增加的时候,又会在原来的位置重新显示,如果使用一般的Gri ...