当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。
一、Comparator
强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。
接口方法:
-
-
-
-
int compare(Object o1, Object o2);
/**
* @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
*/
int compare(Object o1, Object o2);
案例:
- import java.util.Arrays;
-
import java.util.Comparator;
-
-
public class SampleComparator implements Comparator {
-
-
public int compare(Object o1, Object o2) {
-
return toInt(o1) - toInt(o2);
- }
-
-
private int toInt(Object o) {
- String str = (String) o;
-
str = str.replaceAll("一", "1");
-
str = str.replaceAll("二", "2");
-
str = str.replaceAll("三", "3");
-
-
return Integer.parseInt(str);
- }
-
-
-
-
-
public static void main(String[] args) {
-
String[] array = new String[] { "一二", "三", "二" };
-
Arrays.sort(array, new SampleComparator());
-
for (int i = 0; i < array.length; i++) {
- System.out.println(array[i]);
- }
- }
-
- }
import java.util.Arrays;
import java.util.Comparator;
public class SampleComparator implements Comparator {
public int compare(Object o1, Object o2) {
return toInt(o1) - toInt(o2);
}
private int toInt(Object o) {
String str = (String) o;
str = str.replaceAll("一", "1");
str = str.replaceAll("二", "2");
str = str.replaceAll("三", "3");
//
return Integer.parseInt(str);
}
/**
* 测试方法
*/
public static void main(String[] args) {
String[] array = new String[] { "一二", "三", "二" };
Arrays.sort(array, new SampleComparator());
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
二、Comparable
强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。
接口方法:
/**
* @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。
*/
int compareTo(Object o);
假设对象User,需要按年龄排序:
- public class User {
-
-
private String id;
-
private int age;
-
-
public User(String id, int age) {
-
this.id = id;
-
this.age = age;
- }
-
-
public int getAge() {
-
return age;
- }
-
-
public void setAge(int age) {
-
this.age = age;
- }
-
-
public String getId() {
-
return id;
- }
-
-
public void setId(String id) {
-
this.id = id;
- }
-
- }
public class User {
private String id;
private int age;
public User(String id, int age) {
this.id = id;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
改造后的对象:
- import java.util.Arrays;
-
-
public class User implements Comparable {
-
-
private String id;
-
private int age;
-
-
public User(String id, int age) {
-
this.id = id;
-
this.age = age;
- }
-
-
public int getAge() {
-
return age;
- }
-
-
public void setAge(int age) {
-
this.age = age;
- }
-
-
public String getId() {
-
return id;
- }
-
-
public void setId(String id) {
-
this.id = id;
- }
-
-
public int compareTo(Object o) {
-
return this.age - ((User) o).getAge();
- }
-
-
-
-
-
public static void main(String[] args) {
-
User[] users = new User[] { new User("a", 30), new User("b", 20) };
- Arrays.sort(users);
-
for (int i = 0; i < users.length; i++) {
- User user = users[i];
-
System.out.println(user.getId() + " " + user.getAge());
- }
- }
-
- }
import java.util.Arrays;
public class User implements Comparable {
private String id;
private int age;
public User(String id, int age) {
this.id = id;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int compareTo(Object o) {
return this.age - ((User) o).getAge();
}
/**
* 测试方法
*/
public static void main(String[] args) {
User[] users = new User[] { new User("a", 30), new User("b", 20) };
Arrays.sort(users);
for (int i = 0; i < users.length; i++) {
User user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
}
}
三、Comparator和Comparable的区别
先看一下使用Comparator对User集合实现排序的方式:
- import java.util.Arrays;
-
import java.util.Comparator;
-
-
public class UserComparator implements Comparator {
-
-
public int compare(Object o1, Object o2) {
-
return ((User) o1).getAge() - ((User) o2).getAge();
- }
-
-
-
-
-
public static void main(String[] args) {
-
User[] users = new User[] { new User("a", 30), new User("b", 20) };
-
Arrays.sort(users, new UserComparator());
-
for (int i = 0; i < users.length; i++) {
- User user = users[i];
-
System.out.println(user.getId() + " " + user.getAge());
- }
- }
-
- }
import java.util.Arrays;
import java.util.Comparator;
public class UserComparator implements Comparator {
public int compare(Object o1, Object o2) {
return ((User) o1).getAge() - ((User) o2).getAge();
}
/**
* 测试方法
*/
public static void main(String[] args) {
User[] users = new User[] { new User("a", 30), new User("b", 20) };
Arrays.sort(users, new UserComparator());
for (int i = 0; i < users.length; i++) {
User user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
}
}
一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等
分享到:
相关推荐
在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...
在Java编程语言中,Comparable和Comparator接口是两个重要的概念,它们都用于对象的排序,但有着不同的使用场景和特点。本文将深入探讨这两个接口的区别,以及它们在实际开发中的应用。 首先,我们来了解一下...
在Java编程语言中,Comparable和Comparator是两个非常重要的接口,它们都用于对象的比较和排序。下面是关于这两个接口的详细解释: **Comparable接口** Comparable接口位于`java.lang`包下,它是一个对象自比较的...
当需要对`List`中的对象进行自定义排序时,`Comparator`接口就派上了用场。`Comparator`是一个可以比较两个对象的类,它提供了一种方式来定义自定义的比较规则,从而实现灵活的排序逻辑。 `Comparator`接口位于`...
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
总结来说,Java中的List可以通过自定义Comparator或者利用泛型和方法引用来实现对象多属性的动态排序。这种技术在处理复杂数据结构时非常有用,使得代码更加简洁且易于维护。通过学习和实践这部分内容,开发者可以...
当我们需要对List中的元素进行排序时,`Collections.sort()`方法就派上了用场。这个方法能够根据元素的自然顺序或者自定义的比较器进行排序。本文将深入探讨`Collections.sort()`的使用、原理以及如何自定义排序规则...
1. **自然排序**:如果 `List` 中的元素是实现了 `Comparable` 接口的对象,那么可以使用 `Collections.sort()` 方法进行自然排序。`Comparable` 接口定义了一个 `compareTo()` 方法,该方法用于比较对象之间的大小...
可以通过两种方式自定义对象的属性大小进行比较,对一个list或数组对根据属性排序一个list或数组
Comparator接口位于java.util包中,它允许我们为Java集合框架中未实现Comparable接口的对象提供一个“比较器”。比较器本质上是一种特殊类型的对象,这种对象知道如何将两个对象进行比较。一个比较器的作用是定义...
在Java中,我们可以使用Comparable接口来实现自定义排序。例如,我们可以创建一个Record类,实现Comparable接口,并重写compareTo方法。在compareTo方法中,我们可以使用String的compareTo方法来比较两个字符串的...
在我们的例子中,`String`类已经实现了`Comparable<String>`接口,因此我们可以直接对`List<String>`进行排序。然而,`Collections.sort()`是基于字符串的自然顺序进行排序,即按照Unicode字符的编码顺序比较字符串...
在Java编程中,`List`接口是集合框架的重要组成部分,提供了丰富的操作方法,其中包括排序功能。`List`对象排序的通用方法对于优化程序性能、处理动态数据尤其关键,特别是当从数据库查询的数据需要根据特定字段进行...
传统的方法是在每个实体类中重写`Comparable`接口或提供比较器(`Comparator`),这不仅增加了代码量,而且降低了代码的可维护性和复用性。为了解决这一问题,可以设计一个通用的工具类来实现基于对象属性的排序功能...
在Java编程语言中,Comparable和Comparator接口都用于比较对象,但它们之间存在一些关键区别,这对于理解和优化代码的可扩展性至关重要。 首先,Comparable接口是一个排序接口,它定义了一个单一的方法`compareTo(T...
如果列表中的对象实现了`Comparable`接口,那么可以省略`Comparator`,因为`Comparable`已经内置了默认的排序规则。 博客中提到的程序源码可能包含了以下内容: ```java import java.util.*; class Student ...
在Java编程中,当我们需要对对象进行排序时,经常会用到两种方式:一种是通过实现`Comparable`接口,另一种则是通过实现`Comparator`接口。这两种方式各有特点,在不同的场景下有着不同的应用。本文将详细介绍这两种...