Java学习总结:37(比较器)
比较器
Arrays类
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public static boolean equals(int [] a,int [] a2) | 普通 | 判断两个数组是否相等,此方法被重载多次,可以判断各种数据类型的数组 |
2 | public static void fill(int [] a,int val) | 普通 | 将指定内容填充到数组中,此方法被重载多次,可以填充各种数据类型的数组 |
3 | public static void sort(int [] a) | 普通 | 数组排序,此方法被重载多次,可以对各种数据类型的数组进行排序 |
4 | public static int binarySearch(int [] a,int key) | 普通 | 对排序后的数组进行检索,此方法被重载多次,可以对各种数据类型的数组进行检索 |
5 | public static String toString(int [] a) | 普通 | 输出数组信息,此方法被重载多次,可以输出各种数据类型的数组 |
Arrays类中的binarySearch()和sort()方法
例:查找数组内容
package Project.Study.ArrayClass;import java.util.Arrays;public class Test1 {public static void main(String[]args){int data[]=new int[]{1,5,6,7,2,4,3,9,8};java.util.Arrays.sort(data); //数组必须排序才可以查找System.out.println(Arrays.binarySearch(data,9));}
}
//结果:
//8(排序后的数据索引)
注:binarySearch()方法为二分查找,使用前必须要对目标数组进行排序,如果数组没有排序,则查询到的结果是不确定的。
Arrays类中的equals()方法
例:数组相等比较
package Project.Study.ArraysClass;import java.util.Arrays;public class Test2 {public static void main(String[]args){int data1[]=new int[]{1,2,3,4,5};int data2[]=new int[]{1,2,3,4,5};int data3[]=new int[]{1,2,3};System.out.println(Arrays.equals(data1,data2)); //比较是否相等System.out.println(Arrays.equals(data1,data3));}
}
//结果:
//true
//false
注意:Arrays类中的equals()方法并不是Object类定义的equals()方法,只是借用了方法名称。使用此方法时,必须保证数组中的数据内容的顺序是一致的。
例:当数据内容顺序不一致时
package Project.Study.ArraysClass;import java.util.Arrays;public class Test2 {public static void main(String[]args){int data1[]=new int[]{1,2,3,4,5};int data2[]=new int[]{1,2,3,5,4};int data3[]=new int[]{1,2,3};System.out.println(Arrays.equals(data1,data2)); //比较是否相等System.out.println(Arrays.equals(data1,data3));}
}
//结果:
//false
//false
Arrays类中的fill()方法
例:数组填充
package Project.Study.ArraysClass;import java.util.Arrays;public class Test3 {public static void main(String[]args){int data[]=new int[10];Arrays.fill(data,3); //填充数组数据System.out.println(data);System.out.println(Arrays.toString(data));//将数组变为字符串输出}
}
//结果:
//[I@10f87f48
//[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
比较器:Comparable
上面我们说的排序只是针对普通数组的排序,而对象数组也可以用sort()方法进行排序(public static void sort(Object[]a)),前提是:对象所在的类一定要实现Comparable接口,否则就会出现ClassCastException异常。
该接口定义如下:
public interface Comparable<T>{public int compareTo(T o);
}
我们可以看到,Comparable接口中只定义了一个compareTo()方法,此方法返回一个int型数据,而用户覆写此方法时只需要返回3种结果:1、-1、0。
例:实现对象数组排序
package Project.Study.ComparableClass;import java.util.Arrays;class Book implements Comparable<Book>{ //实现比较器private String title;private double price;public Book(String title,double price){this.title=title;this.price=price;}@Overridepublic String toString(){return "书名:"+this.title+",价格:"+this.price+"\n";}@Overridepublic int compareTo(Book o){ //Arrays.sort()会自动调用此方法比较return Double.compare(this.price, o.price);}
}
public class Test1 {public static void main(String[]args){Book[] book =new Book[]{new Book("Java",79.8),new Book("C++",69.8),new Book("Python",75.8),new Book("C",63.8)};Arrays.sort(book); //对象数组排序System.out.println(Arrays.toString(book));}
}
//结果:
//[书名:C,价格:63.8
//, 书名:C++,价格:69.8
//, 书名:Python,价格:75.8
//, 书名:Java,价格:79.8
//]
在上程序中,由于Book类在定义的时候实现了Comparable接口,所以在主类中调用Arrays.sort()方法时,会自动被Book类覆写的compareTo()方法判断对象的大小关系,按照价格由低到高进行排序。
数据结构——BinaryTree
先简单介绍一下树的操作原理:选择第一个数据作为根节点,而后比根节点小的放在根节点的左子树(左节点),比根节点大的数据放在右子树(右节点),取得数据时按照中序遍历的方式取出(左——中——右)。
例:实现二叉树
package Project.Study.BinaryTreeClass;import java.util.Arrays;class Book implements Comparable<Book>{ //实现比较private String title;private double price;public Book(String title,double price){this.title=title;this.price=price;}@Overridepublic String toString(){return "书名:"+this.title+",价格:"+this.price+"\n";}@Overridepublic int compareTo(Book o){return Double.compare(this.price,o.price);}
}
@SuppressWarnings("rawtypes")
class BinaryTree{private class Node{private Comparable data; //排序的依据就是Comparableprivate Node left; //保存左节点private Node right; //保存右节点public Node(Comparable data){ //定义构造方法this.data=data;}@SuppressWarnings("unchecked")public void addNode(Node newNode){if (this.data.compareTo(newNode.data)>0){ //对象数据比较if (this.left==null){ //左节点为nullthis.left=newNode; //保存左节点}else{this.left.addNode(newNode); //继续判断节点保存位置}}else{if (this.right==null){ //右节点为nullthis.right=newNode; //保存到右节点}else{this.right.addNode(newNode); //继续判断节点保存位置}}}public void toArrayNode(){ //将节点转换为对象数组if (this.left!=null){ //表示有左节点this.left.toArrayNode(); //左子树继续取得}//先判断左节点再取出中间节点数据,再取得右节点数据BinaryTree.this.retData[BinaryTree.this.foot++]=this.data;if (this.right!=null){ //表示有右节点this.right.toArrayNode(); //右子树继续取得}}}private Node root; //定义根节点private int count; //保存元素个数private Object[] retData; //保存返回的对象数组private int foot; //操作脚标public void add(Object obj){ //进行数据的追加Comparable com=(Comparable)obj; //转为Comparable才可以实现Node保存Node newNode=new Node(com); //创建新的节点if (this.root==null){ //现在不存在根节点this.root=newNode; //保存根节点}else{this.root.addNode(newNode); //交给Node类处理}this.count++; //保存数据加一}public Object[] toArray(){ //取得全部保存数据if (this.root==null){ //根节点为nullreturn null; //没有数据}this.foot=0; //重置脚标this.retData=new Object[this.count]; //开辟保存数据数组this.root.toArrayNode(); //Node类处理return this.retData; //返回保存的数据}
}
public class Test1 {public static void main(String[]args){BinaryTree bt=new BinaryTree(); //定义二叉树bt.add(new Book("Java",79.8)); //保存数据bt.add(new Book("Python",75));bt.add(new Book("C++",76));bt.add(new Book("C",80));Object[] obj =bt.toArray(); //将数据转换为对象数组取出System.out.println(Arrays.toString(obj)); //利用Arrays类的方法输出}
}
//结果:
//[书名:Python,价格:75.0
//, 书名:C++,价格:76.0
//, 书名:Java,价格:79.8
//, 书名:C,价格:80.0
//]
上程序实现了一个可以判断节点大小关系的二叉树数据结构。
挽救的比较器:Comparator
Comparator接口一般用于不能修改类定义时又需要进行对象数组排序的情况下。
该接口定义如下:
@FunctionalInterface
public interface Comparator<T>{public int compare(T o1,T o2);public boolean equals(Object obj);
}
由该定义我们可以发现,该接口定义了一个compare()方法,此方法的返回3种结果为:1、-1、0.
例:利用Comparator接口实现对象数组排序
package Project.Study.ComparatorClass;class Book{private String title;private double price;public Book(){}public Book(String title,double price){this.title=title;this.price=price;}@Overridepublic String toString(){return "书名:"+this.title+",价格:"+this.price+"\n";}public void setTitle(String title) {this.title = title;}public void setPrice(double price) {this.price = price;}public String getTitle() {return title;}public double getPrice() {return price;}
}
class BookComparator implements java.util.Comparator<Book>{ //假定Book类不能修改,所以为Book类专门设计一个排序的规则类@Overridepublic int compare(Book o1,Book o2){return Double.compare(o1.getPrice(),o2.getPrice());}
}
public class Test1 {public static void main(String[]args){Book[]books=new Book[]{new Book("Java",79.8),new Book("C++",69.8),new Book("Python",75.8),new Book("C",63.8)};java.util.Arrays.sort(books,new BookComparator());System.out.println(java.util.Arrays.toString(books));}
}
//结果:
//[书名:C,价格:63.8
//, 书名:C++,价格:69.8
//, 书名:Python,价格:75.8
//, 书名:Java,价格:79.8
//]
相关文章:

探究rh6上mysql5.6的主从、半同步、GTID多线程、SSL认证主从复制
http://407711169.blog.51cto.com/6616996/1203973/转载于:https://www.cnblogs.com/zengkefu/p/5042351.html

文字转语音(jacob)
近期项目中出现在离线情况下文字转语音的需求 经过尝试发现jacob还不错 注:只适用于windows系统环境 以下为开发记录: 1.pom.xml中引入jacob.jar <dependency><groupId>com.hynnet</groupId><artifactId>jacob</artifactId&…

log4j配置说明
2019独角兽企业重金招聘Python工程师标准>>> 一.参数意义说明 输出级别的种类 ERROR、WARN、INFO、DEBUG ERROR 为严重错误 主要是程序的错误 WARN 为一般警告,比如session丢失 INFO 为一般要显示的信息,比如登录登出 DEBUG 为程序的调试信息…

Python 无法安装PyAudio问题
一、错误与原因 在Windows上没有用于Python 3.7的轮子(预构建包)(有一个用于Python 2.7和3.4到3.6),因此需要在PC上准备构建环境以使用此包。因为有些软件包很难在Windows上构建,所以找到3.7的轮子更容易一…

7-4 水仙花数
7-4 水仙花数 水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153135333。本题要求编写程序,计算所有N位水仙花数。 输入格式: 输入在一行中给出一个正整数N(3≤N≤7)。…

Unreal Engine4 可视化虚拟现实全流程学习教程
课程目标: 这是一套专门为设计院,三维动画公司、效果图公司、景观规划公司、以及有志于进入这些行业创业的公司和人们量身定制的一套虚拟漫游高级教材。 在这套教学里面,我们能够从头开始了解到一个效果图级别的虚拟漫游是怎么制作出来的&…

用python的numpy作线性拟合、多项式拟合、对数拟合
转自:http://blog.itpub.net/12199764/viewspace-1743145/ 项目中有涉及趋势预测的工作,整理一下这3种拟合方法:1、线性拟合-使用mathimport mathdef linefit(x , y): N float(len(x)) sx,sy,sxx,syy,sxy0,0,0,0,0 for i in range(…

Java中的简单工厂模式(转)
Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式:女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面…

Math.toRadians()与 Math.toDegrees()方法介绍
strictfp 的意思是FP-strict,也就是说精确浮点的意思。在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运 行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。因此如果你想让你的浮点运算更加精确, 而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp.

Linux命令基础6-mkdir命令
mkdir是英文单词make directory的缩写。mkdir就是用来创建路径,一般就是用来创建文件夹的。 语法 mkdir (选项)(参数) 选项 -Z:设置安全上下文,当使用SELinux时有效; -m<目标属性>或--mode<目标属性>建立目录的同时设…

原子性,可见性,有序性详解及DCL单例模式两次校验的目的(拓展懒汉式,饿汉式)
进入以后进行第二次判断,是因为,对于首个拿锁者,它的时段instance肯定为null,那么进入new Singleton()对象创建,而在首个拿锁者的创建对象期间,可能有其他线程同步调用getInstance(),那么它们也会通过if进入到同步块试图拿锁然后阻塞。如果能够保证2,3的顺序那么就不会存在安全问题,但是实际因为JIT和处理器会对代码进行优化重排序,那么可能会2,3的顺序颠倒,那么就有可能会出现一个线程拿到了一个未被初始完成的对象,从而引发安全问题。,那么在这种情况下,会出现多个实例对象。

3ds Max中的V-Ray学习
时长3h 30m 大小解压后:2.73G 包含项目文件 1280X720 MP4 语言:英语中英文字幕(根据原英文字幕机译更准确) 3ds Max中的V-Ray简介:官方V-Ray导师 云桥网络 获取课程:3ds Max中的V-Ray学习 Introduction To V-Ray in 3…

7-5 二分法求多项式单根 (20分)
二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f( r )0。 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停…

JAVA的instanceOf什么时候用
我个人理解的一个应用场合就是,当你拿到一个对象的引用时(例如参数),你可能需要判断这个引用真正指向的类。所以你需要从该类继承树的最底层开始,使用instanceof操作符判断,第一个结果为true的类即为引用真…

解决谷歌浏览器在非https下限制获取多媒体对象(音视频)的解决方式
1、浏览器输入:chrome://flags/ 2、输入你要允许的域名地址或ip端口地址(如下图)

After Effects CS4 期末考试卷
AECS4考试A卷转载于:https://blog.51cto.com/hnxdd/1593985

数据图表之圆柱图
需求是这样的,需要一个圆柱实现展示内存的占用变化。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.column{position: relative;width: 300px;height:…

虚幻引擎5–环境设计学习教程
时长:1h 12m |视频:. MP4 1280720,30 fps(r) |音频:AAC,48000 Hz,2ch |大小解压后:1.08G 含课程文件 语言:英语中英文字幕(根据原英文字幕机译更准确) 在这节课中,你将学习如何在虚幻引擎5中从…

Java学习总结:38(正则表达式)
正则表达式 正则表达式本质上是一种字符串操作语法规则,利用它我们能更加灵活地实现字符串的匹配、拆分、替换等操作。 正则标记 所有的正则表达式支持的类都定义在java.util.regex包里面。这个包里面定义了如下两个主要的类: 1.Pattern类:…

PHP Multipart/form-data remote dos Vulnerability
catalog 1. Description 2. Analysis 1. Description PHP is vulnerable to a remote denial of service, caused by repeatedly allocate memory、concatenate string、copy string and free memory when PHP parses header areas of body part of HTTP request with multipar…

HTTP的KeepAlive是开启还是关闭?
转自:http://blog.csdn.net/gaogaoshan/article/details/38580013 1、KeepAlive的概念与优势 HTTP的KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的。当客户端发送一次请求,收到相应内容后,这个连接会保持一段时…

MyBatis中jdbcType=INTEGER、VARCHAR作用
Mapper.xml中 pid #{pid,jdbcTypeINTEGER} pid #{pid} 都可以用 Mybatis中什么时候应该声明jdbcType? 当Mybatis不能自动识别你传入对象的类型时。 什么情况下,Mybatis不能自动识别我的传入类型? 例如:当你传入空值的时候。&…

我让老师失去了孩子
我永远也忘不了我的初中班主任是被我们班气得流产的。她教我们历史,中考前那段日子,由于学业紧张,学校又没特殊安排,她天天挺着大肚子给我们讲课,只有偶尔请假离开去医院检检查。我们班成绩不好,学习气氛差…

3D场景高级合成技术学习
MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch |语言:英语中英文字幕(根据原英文字幕机译更准确)|时长:3h 47m |大小解压后:3.61 GB 含课程文件 创建和渲染三维场景是一项艰巨的任务。但是当你需要在渲染…

Java学习总结:39(反射机制)
反射机制 JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。 Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它…

perl 编程 - 判断系统进程是否活着的方法
2019独角兽企业重金招聘Python工程师标准>>> 前言:我在使用perl编写CGI程序时遇到的一些问题,解决以后,记录一下我的心得,有心的朋友们会从中得到帮助并养成正确使用的好习惯。 perl编程中判断系统进程是否存活的方法…

2009 Competition Highlights by ICPC Live
2009 Competition Highlights by ICPC Live Links:http://www.youtube.com/watch?vn0oZRcAz6w0 转载于:https://www.cnblogs.com/yewei/archive/2012/09/07/2674862.html

C4D灯光照明技术学习教程
C4D的灯光照明技术 大小解压后:4.8G 学会用Redshift点亮3D场景,像专业人士一样塑造光线 灯光在任何空间都是至关重要的,无论是真实的还是虚拟的。它能够传递某种感觉或情感。平面设计师罗伯托冈萨雷斯观察到如此重要的方面,并将其…

Java学习总结:40(国际化)
国际化 所谓国际化程序指的是同一套程序代码可以在不同的国家使用,可以根据其应用的国家自动在项目中显示出本国的相应文字信息。 使用Locale类定义语言环境 Locale类的常用方法 No.方法类型描述1public Locale(String language,String country)构造设置使用的语…

AFNetWorking 队列请求
我们在开发过程中,经常会遇到有些页面不止一个网络请求,有时候需要两个三个甚至更多,这个时候我们就需要队列请求,下边是GET请求的多个请求放在队列里边: [objc] view plaincopyprint? NSURL *url [NSURL URLWithStr…