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.util.Comparator`接口定义了一个比较两个对象的方法`compare(T o1, T o2)`,使得任何类实现了这个接口就必须提供比较逻辑。 Java API中的主要接口包括: 1. `java.io.Serializable`: 使类的对象能够...
在Java编程语言中,`Comparable`接口和`Comparator`接口是用于对象排序的关键工具。这两个接口都涉及到...在阅读提供的"javaCompare"文件时,你将深入理解这两个接口的用法和实现细节,进一步提升你的Java编程技能。
`Comparator<T>`是Java.util包中的一个接口,它提供了一个`compare(T o1, T o2)`方法,用于比较两个对象的顺序。 实验中,创建了三个实现Comparator接口的类:CompareName、CompareBirthday和CompareAge。每个类都...
在Java中,`compare`方法是`Comparator`接口的一个核心方法,用于自定义对象的比较规则。用户可以创建自己的`Comparator`实现来比较特定类型的对象。另外,`Comparable`接口也包含`compareTo`方法,用于比较类的实例...
Java 比较接口comparable与comparator区别解析 Java 语言中提供了两个比较接口: Comparable 和 Comparator,这两个接口都是用于比较对象的大小顺序的,但它们有着不同的使用场景和实现方式。在本文中,我们将详细...
【Java接口与实现接口的类】实验报告详细解析 在Java编程中,接口(Interface)是一种定义行为规范的抽象类型,它允许类实现多个接口,从而实现多继承。本实验旨在帮助学生深入理解接口的概念以及如何在实际编程中...
在Java中,我们可以使用Comparable接口来实现自定义排序。例如,我们可以创建一个Record类,实现Comparable接口,并重写compareTo方法。在compareTo方法中,我们可以使用String的compareTo方法来比较两个字符串的...
Java 8引入了函数式接口的概念,这是一项重要的更新,旨在支持函数式编程风格。函数式接口是指只有一个抽象方法的接口,这样的设计使得接口能够被用作 Lambda 表达式的类型。Lambda 表达式是一种简洁的匿名函数表示...
compare.java 演示前缀、后缀自加之间区别的程序 constCharExample.java 演示转义字符 converseNumber.java 逆向输出数字 daffodilNumber.java 求水仙花数 division.java 演示整除结果 errorCompoundVariable....
在Java编程语言中,`compare()`方法是`Comparator`接口的一部分,它用于比较两个对象的顺序。这个方法在实现排序算法、数据结构如`TreeSet`和`TreeMap`,以及自定义对象的排序逻辑时非常有用。在这个文档中,我们将...
Comparable接口是Java中用于定义对象之间自然顺序的接口,它只有一个方法`compareTo(T o)`,用于比较当前对象与指定对象的大小关系。当一个类实现了Comparable接口,那么它的实例就可以进行排序,比如在集合框架中...
8. **Future与Callable接口**:这些接口允许我们异步计算结果,并能够获取任务的执行状态。 9. ** Fork/Join框架**:这是一种并行计算模型,适用于那些可以拆分为子任务并进行并行处理的问题。 10. **并发模式**:...
例如,`Comparator<T>` 接口就是一个典型的函数式接口,因为它只包含一个抽象方法 `compare(T o1, T o2)`。因此,它可以被 Lambda 表达式所实现。 ```java Comparator<String> reverseOrder = (a, b) -> b....
Comparable 接口是 Java 中的一个接口,它提供了一个通用的比较机制,允许对象之间进行比较。实现 Comparable 接口的类可以使用 Arrays.sort() 方法对其对象数组进行排序。 在上面的示例代码中,我们定义了一个 ...
2. **Comparator 接口**:这是一个接口,用于定义比较两个对象的自然顺序的方法。 3. **Collections.sort() 方法**:这是一个静态方法,用于对集合进行排序。它可以接受一个可选的比较器参数来进行自定义排序。 ###...
Lambda表达式是Java 8中引入的一种新的语法元素,用于实现函数式接口,即具有单一抽象方法的接口。Lambda表达式为Java添加了函数式编程的能力,使得开发者可以编写更简洁的代码,特别是在处理集合(Collection)和多...
此外,`java.util.function`包提供了大量预定义的函数接口,如`Predicate`、`Function`、`Supplier`等,用于支持高阶函数和函数组合。 三、Stream API Stream API是一种新的数据处理方式,它允许开发者以声明式的...
Java比较器是一个接口,位于`java.util`包下,其主要作用是提供一种方式来定义对象之间的比较规则。当我们需要对非原始类型(如自定义类的对象)进行排序时,由于它们可能没有天然的比较规则(如数字的大小),就...
Java中的Comparator接口是排序的关键工具,它允许程序员自定义对象的比较规则,从而在集合、数组或树结构(如TreeSet、TreeMap)中实现定制化的排序。在Java的Collections框架中,Comparator扮演着重要的角色,特别...
Java中的比较器主要涉及到两种接口:Comparable接口和Comparator接口,它们在处理对象排序时起着关键作用。 **Comparable接口** Comparable接口是Java.lang包下的一个接口,它只有一个方法:compareTo(T o)。当一个...