1.
两种比较接口分析
在
“
集合框架
”
中有两种比较接口:
Comparable
接口和
Comparator
接口。
Comparable
是通用的接口,用户可以实现它来完成自己特定的比较,而
Comparator
可以看成一种算法的实现,在需要容器集合实现比较功能的时候,来指定这个比较器,这可以看成一种设计模式,将算法和数据分离。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。
一个类实现了
Camparable
接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用
Sort
方法排序了。
而
Comparator
的作用有两个:
1
、如果类的设计师没有考虑到
Compare
的问题而没有实现
Comparable
接口,可以通过
Comparator
来实现比较算法进行排序;
2
、为了使用不同的排序标准做准备,比如:升序、降序或其他什么序。
2 Comparable
接口
public
interface
Comparable<T> {
public
int
compareTo(T o);
}
|
java.lang. Comparable
接口定义类的自然顺序,实现该接口的类就可以按这种方式排序。
1
)
int compareTo(Object o):
比较当前实例对象与对象
o
,如果位于对象
o
之前,返回负值,如果两个对象在排序中位置相同,则返回
0
,如果位于对象
o
后面,则返回正值。
2
)在
Java 2 SDK
版本
1.4
中有二十四个类实现
Comparable
接口。下表展示了
8
种基本类型的自然排序。虽然一些类共享同一种自然排序,但只有相互可比的类才能排序。
类
|
排序
|
BigDecimal,BigInteger,Byte,Double, Float,Integer,Long,Short
|
按数字大小排序
|
Character
|
按
Unicode
值的数字大小排序
|
String
|
按字符串中字符
Unicode
值排序
|
利用
Comparable
接口创建自己的类的排序顺序,只是实现
compareTo()
方法的问题。通常就是依赖几个数据成员的自然排序。同时类也应该覆盖
equals()
和
hashCode()
以确保两个相等的对象返回同一个哈希码。
这个接口的作用:如果数组或者集合中的(类)元素实现了该接口的话
,
我们就可以调用
Collections.sort
和
Arrays.sort
排序,或应用于有序集合
TreeSet
和
TreeMap
中。
下面设计一个有序的类
Person
,它实现
Comparable
接口,以年龄为第一关键字,姓名为第二关键字升序排序。
Person.java
package
com.zj.sort.comparable;
public
class
Person
implements
Comparable<Person> {
private
int
age
;
private
String
name
;
public
Person(
int
age, String name) {
this
.
age
= age;
this
.
name
= name;
}
public
int
compareTo(Person person) {
int
cop =
age
- person.getAge();
if
(cop != 0)
return
cop;
else
return
name
.compareTo(person.
name
);
}
public
int
getAge() {
return
age
;
}
public
String getName() {
return
name
;
}
public
int
hashCode() {
int
result = 17;
result = 37 * result +
age
;
result = 37 * result +
name
.hashCode();
return
result;
}
public
boolean
equals(Object o) {
if
(!(o
instanceof
Person))
return
false
;
Person person = (Person) o;
return
(
age
== person.
age
) && (
name
.equals(person.
name
));
}
public
String toString() {
return
(
age
+
"{"
+
name
+
"}"
);
}
}
|
2.1
测试
Arrays.sort
()方法
ArraysSortUnit.java
package
com.zj.sort.comparable;
import
java.util.Arrays;
import
com.zj.compare.Person;
public
class
ArraysSortUnit {
public
static
void
main(String[] args) {
Person[] ps = {
new
Person(20,
"Tom"
),
new
Person(20,
"Jeff"
),
new
Person(30,
"Mary"
),
new
Person(20,
"Ada"
),
new
Person(40,
"Walton"
),
new
Person(61,
"Peter"
),
new
Person(20,
"Bush"
) };
System.
out
.println(Arrays.toString
(ps));
Arrays.sort
(ps);
System.
out
.println(Arrays.toString
(ps));
}
}
|
结果:
[20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.2
测试
Collections.sort
()方法
CollctionsSortUnit.java
package
com.zj.sort.comparable;
import
java.util.Arrays;
import
java.util.Collections;
import
com.zj.compare.Person;
public
class
CollctionsSortUnit {
public
static
void
main(String[] args) {
Person[] ps = {
new
Person(20,
"Tom"
),
new
Person(20,
"Jeff"
),
new
Person(30,
"Mary"
),
new
Person(20,
"Ada"
),
new
Person(40,
"Walton"
),
new
Person(61,
"Peter"
),
new
Person(20,
"Bush"
) };
System.
out
.println(Arrays.toString
(ps));
Collections.sort
(Arrays.asList
(ps));
System.
out
.println(Arrays.toString
(ps));
}
}
|
结果:
[20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.3
测试
TreeSet
TreeSetUnit.java
package
com.zj.sort.comparable;
import
java.util.TreeSet;
import
com.zj.compare.Person;
public
class
TreeSetUnit {
public
static
void
main(String[] args) {
TreeSet<Person> set =
new
TreeSet<Person>();
set.add(
new
Person(20,
"Tom"
));
set.add(
new
Person(20,
"Jeff"
));
set.add(
new
Person(30,
"Mary"
));
set.add(
new
Person(20,
"Ada"
));
set.add(
new
Person(40,
"Walton"
));
set.add(
new
Person(61,
"Peter"
));
set.add(
new
Person(20,
"Bush"
));
System.
out
.println(set);
}
}
|
结果:
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.4
测试
TreeMap
TreeMapUnit.java
package
com.zj.sort.comparable;
import
java.util.TreeMap;
import
com.zj.compare.Person;
public
class
TreeMapUnit {
public
static
void
main(String[] args) {
TreeMap<Person, String> map =
new
TreeMap<Person, String>();
map.put(
new
Person(20,
"Tom"
),
"Tom"
);
map.put(
new
Person(20,
"Jeff"
),
"Jeff"
);
map.put(
new
Person(30,
"Mary"
),
"Mary"
);
map.put(
new
Person(20,
"Ada"
),
"Ada"
);
map.put(
new
Person(40,
"Walton"
),
"Walton"
);
map.put(
new
Person(61,
"Peter"
),
"Peter"
);
map.put(
new
Person(20,
"Bush"
),
"Bush"
);
System.
out
.println(map);
}
}
|
结果:
{20{Ada}=Ada, 20{Bush}=Bush, 20{Jeff}=Jeff, 20{Tom}=Tom, 30{Mary}=Mary, 40{Walton}=Walton, 61{Peter}=Peter}
3. Comparator
接口
public
interface
Comparator<T> {
int
compare(T o1, T o2);
boolean
|
分享到:
相关推荐
这是java的comparable接口和comparator接口的例子
compare.java 演示前缀、后缀自加之间区别的程序 constCharExample.java 演示转义字符 converseNumber.java 逆向输出数字 daffodilNumber.java 求水仙花数 division.java 演示整除结果 errorCompoundVariable....
关于List接口和ArrayList类的使用
此类提供格式化和解析数值的接口。若要格式化当前Locale的数值,可使用其中一个方法: myString = NumberFormat.getInstance().format(myNumber); 若要格式化不同 Locale 的日期,可在调用getInstance方法时指定它...
定制排序:在创建TreeSet集合对象时,并提供一个Comparator接口实现类对象与该TreeSet集合关联, 由Comparator实现类对象负责集合元素的排序逻辑。 // 自定义比较器 class MyTreeSetCompartor implements...
compare(String s1, String s2) { return s1.compareTo(s2); } }); Java 8 Collections.sort(names, (s1, s2) -> s1.compareTo(s2)); #Java 8 - Lambda 表达式 句法 parameter -> expression body 可选类型声明 - ...
ArraySort java数组排序的两种方法:实现Comparator接口,重写compare方法 2实现Comparable接口
(带有compare抽象方法)。 当 lambda 是函数式接口抽象方法的实现时,可以如下创建该函数式接口的实例。 例子 Comparator< String > comparator = ( String a, String b) - > { return a . compareTo(b);}; ...
Java中的功能接口是仅包含一个抽象(未实现)方法的接口。 除了单个未实现的方法之外,功能接口还可以包含具有实现的默认方法和静态方法。 带集合的Lambda表达式 如果要自定义排序顺序,请使用Comparator界面,而...
注意实现 Comparator 接口的 compare(Object obj1,Object obj2)函数。 4.以 List 接口对象(ArrayList)为基础建立一个通信录,要求通信录中必须含有编号、姓名, 性别、电话、地址、Email 等。实现该类并包含添加...
比较对象 它是一个示例 java 程序,用于解释比较器和可比较接口的使用 执照 版权所有 (c) 2014 GitHub, Inc。有关许可权利和限制,请参阅许可文件 (GNU GPL v2.0)
Java8新特性Java8新特性Lambda表达式函数式接口:方法引用、构造器引用及数组引用Stream APIOptional类 Java8新特性 Lambda表达式 /** * Lambda表达式的使用 * 1.举例:(o1,o2)->Integer.compare(o1,o2); * 2....
因为在Java库函数里,... //定义一个静态内部类,继承Comparator接口,并重写他的compare方法 //return o2-o1 就可以 @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } } pu
java8 源码 Java8 Lambda表达式 λ表达式可以被当做是一个Object(注意措辞)。λ表达式的类型,叫做“目标类型(target type)”。...compare(T o1, T o2); boolean equals(Object obj); } 注意最后这个
Comparator是个接口,可重写compare()及equals()这两个方法,接下来通过本文给大家介绍Java中Collections.sort排序,需要的的朋友参考下吧
排序算法,基于compare,comparable接口的使用,使用collection下的sort方法对读取的文件中的内容进行排序,并去重,很不错的简单小程序,谢谢下载
•Java 7为所有包装类增加一个新方法: compare(x , y)的方法。该方法用于比较两个包装类实例,当x>y, 返回大于0的数;当x==y,返回0;否则返回小于0的数。 对象的方法 •打印对象和toString方法:...
如果是定制排序,需要创建TreeSet对象的时候,传入一个Comparetor接口实现类对象,重写compare方法 一般是默认排序用自然排序(Comparable接口),特殊排序用定制排序(Comparetor接口实现) LinkedHashSet:如果...
public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); }; }); 这里是在使用Comparator接口实现排序时使用的,使用匿名内部类,重写方法,大概四五行的样子 使用Lambda表达式...
3.1.4比较/修正(Compare/Patch) 62 3.1.5编辑器(Editors) 64 3.1.6档案关联(File Associations) 65 3.1.7按键(Keys) 67 3.1.8标签装饰(Label Decorations) 73 3.1.9链接资源(Linked Resources) 73 3.1.10历史纪录...