12.Java中Comparable接口,Readable接口和Iterable接口
1.Comparable接口
说明:可比较(可排序的)
例子:按照MyClass的y属性进行生序排序
class MyClass implements Comparable<MyClass>{
private int x;
private int y; public MyClass(int x,int y){
this.x=x;
this.y=y;
} @Override
public int compareTo(MyClass o) {
//按照y进行升序排序
return y<o.y?-1:(y==o.y?0:1);
} @Override
public String toString(){
return x+"@"+y;
}
} main函数
List<MyClass> list=new ArrayList<>(Arrays.asList(new MyClass(1,2),new MyClass(3,1),new MyClass(2,3)));
Collections.sort(list);
System.out.println(list); 结果:
[3@1, 1@2, 2@3]
2.Comparator接口
说明:迭代器,是sort函数的参数
例子:按照MyClass的x属性进行排序
class MyClass{
public int x;
public int y; public MyClass(int x,int y){
this.x=x;
this.y=y;
} @Override
public String toString(){
return x+"@"+y;
}
} class MyComparator implements Comparator<MyClass>{
@Override
public int compare(MyClass o1,MyClass o2){
return o1.x<o2.x?-1:(o1.x==o2.x?(o1.y<o2.y?-1:(o1.y==o2.y?0:1)):1);
} } main函数
List<MyClass> list=new ArrayList<>(Arrays.asList(new MyClass(1,2),new MyClass(3,1),new MyClass(3,3),new MyClass(3,2),new MyClass(2,3)));
Collections.sort(list,new MyComparator());
System.out.println(list);
结果: [1@2, 2@3, 3@1, 3@2, 3@3]
3.Iterable接口
说明:可迭代,实现Iterable<T>接口之后,可以用Foreach遍历
例子:有点多余,List直接就可以用foreach遍历
class MyClass implements Iterable<Integer>{
public List<Integer> list=new ArrayList<>(Arrays.asList(new Integer(1),new Integer(2),new Integer(3))); @Override
public Iterator<Integer> iterator() {
return list.iterator();
} @Override
public String toString(){
return super.toString();
}
}
例子:结合Iterator接口
class MyClass implements Iterable<Integer>{
int[] array=new int[]{1,2,3,4,5,6,7};
int index=0; @Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
@Override
public boolean hasNext() {
return index<array.length;
} @Override
public Integer next() {
return array[index++];
} @Override
public void remove() {
throw new UnsupportedOperationException();
}
};
} @Override
public String toString(){
return super.toString();
}
}
4.Readable接口
说明:实现Readable接口后可以作为Scanner对象的输入流
例子:
public class TaskTimeoutDemo {
public static void main(String[] args) {
Scanner scanner=new Scanner(new MyClass(2));
while(scanner.hasNext()){
System.out.println(scanner.nextLine());
}
}
} class MyClass implements Readable{
private int count;
public MyClass(int count){
this.count=count;
} @Override
public int read(CharBuffer cb) throws IOException {
if(count--==0) return -1;
cb.append("Aa");
cb.append("Bb");
cb.append("Cc");
cb.append("Dd");
cb.append("Ee");
cb.append("Ff");
cb.append("Gg");
cb.append("Hh");
cb.append("Ii\n");
return 1;
}
}
这里需要注意一点什么时候会调用read函数?
1.scanner.hasNext()后发现缓冲区中没有数据,就回去读区输入流中的数据,输入流的数据存储在CharBuffer中,上边的例子中一次read会向缓冲区中添加一行字符串,整个程序会调用两次read函数。
12.Java中Comparable接口,Readable接口和Iterable接口的更多相关文章
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Java中的集合(十二) 实现Map接口的WeakHashMap
Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...
- Java 中 Comparable 和 Comparator 比较
Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...
- java中封装,继承,多态,接口学习总结
### 一:封装java中封装是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通 ...
- Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别
1. Java中线程的创建有两种方式: (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...
- [转] Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- java中有关流操作的类和接口
一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...
- 多线程——Java中继承Thread类与实现Runnable接口的区别
线程我只写过继承Thread类的,后来知道java多线程有三种方式,今天首先比较一下常用的继承Thread类和实现Runnable接口的区别. 按着Ctrl键进入Thread之后,发现Thread类也 ...
随机推荐
- Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。
######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组user www www;#nginx进程数,建议设置为等于CPU总核心数.worker_proc ...
- 网络抓包wireshark(转)
转自 网络抓包wireshark 抓包应该是每个技术人员掌握的基础知识,无论是技术支持运维人员或者是研发,多少都会遇到要抓包的情况,用过的抓包工具有fiddle.wireshark,作为一个不是经 ...
- [Android]优化相关
尽量减少布局的层次,最多10层,可以通过LinearLayout向RelativeLayout的转变来减少层的数量 使用ListView的时候,getView方法中的对象尽量重用
- php-fpm启动,重启,终止操作
最近安装了mysqli扩展,重启了nginx后,phpinfo()没有显示出mysqli,后来搞不出原因,直接使用了pdo连接数据库.直到今天安装redis后phpinfo()没有显示redis,内心 ...
- STM32f103 定时器之编码器接口模式
背景 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数.这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数.阅读 ...
- android App使用新浪微博sdk的使用总结
问题1:注册app的key 问题2:在微博开放平台,我的应用中心中,设置应用的基本信息的时候其中有一项,是设置你的应用的签名,签名是需要在安卓设备上安装一个生成签名的app(这个app界面很丑,这点我 ...
- php中的高危函数
phpinfo() 功能描述:输出 PHP 环境信息以及相关的模块.WEB 环境等信息. 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec(). 危险等级 ...
- 安卓中AIDL的使用方法快速入门
1.AIDL是什么? AIDL全称是Android Interface Definition Language,即安卓接口定义语言. 2.AIDL是用来做什么的?(为什么要有AIDL) AIDL是用来 ...
- ubuntu
mongoChef: http://3t.io/mongochef/download/core/platform/#tab-id-3 背景色改成豆沙绿: /usr/share/themes/Ambia ...
- Integer与int的区别
简述:int与Integer的区别: 对于它们,我们可能只是知道简单的区别.Integer是int的一个封装类,int的初始值为0,而Integer的初始值为null.但是他们之间真的仅仅只有这些区别 ...