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类也 ...
随机推荐
- redis 操作string 的测试
1>set set name zhangsan :OK get name: zhangsan set name lisi:OK get name: lisi 2> setnx 如果存 ...
- Zabbix自定义监控8080端口的连接数
Zabbix自定义监控8080端口的连接数 一 zabbix自定义监控实现思路 实际上我们要想使用zabbix来监控一些服务的原理很简单,步骤分别是:1.写一个脚本用于获取待监控服务的一些状态信息2. ...
- 关于node的http模块
var http = require('http'); /** * 创建服务器的两种写法,第一种写法如下 * 由于server已经继承了EventEmitter的事件功能,所以可以使用高级函数编写方式 ...
- zend studio面板功能
不小心把zend界面右边的显示类中各个方法的窗口关掉了,如何打开呢: 法一:点击Windows菜单,选择show view项,选择outline即可: 法二:点击Windows菜单,选择Reset P ...
- 转→js数组遍历 千万不要使用for...in...
看到一篇内容还不错,但是排版实在糟糕, 逼死强迫症患者啊,直接拉下去找原文连接,找到了,但是已经消失了···500错误... 第一次因为实在看不下去一篇博客的排版, 为了排版而转载... 转载地址:h ...
- mac 快捷键拾遗
1.隐藏所有其它窗口 (hide) 窗口太多太乱,按下Command+Option/alt+H组合键,除了当前窗口以外的其它窗口会自动隐藏(不是缩小). 2. Command X 留意, ...
- 通过transform修改位置 大小 旋转 形变
--通过transform修改位置(平移)- CGAffineTransformMakeTranslation(**X偏移量**, **Y偏移量**);- CGAffineTransformTrans ...
- Toad各版本所包含的组件
Toad for Oracle Base Edition Toad for Oracle Knowledge Xpert for PL/SQL Knowledge Xpert for Oracle A ...
- python的反转(切片)
看下面代码吧,简单来说不如直接看代码.如下: #coding=utf-8 __author__ = 'debude' a = 'python' print a[::-1] #从最后n开始,每走一位都打 ...
- springmvc拦截器验证登录时间
在前一篇[Filter实现用户名验证]的随笔里,记录了如何使用filter 这次增加了拦截器实现 ①filter实现用户登陆时验证用户名是否为null ②interceptor实现用户登陆时时间判断, ...