集合排序中的comparator和comparable

关于集合框架中对集合的排序问题

涉及到集合排序的问题,就要用到.sort()方法,对于集合的排序,有两个接口实现了集合中的排序问题:

  • 1,java.lang.interface Comparable
  • 2,java.util.Interface Comparator
    1.Comparable的使用
    比如我们定义了一个用户类:User
package test002;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 用户类
 * @author 黄小宝
 *
 */
public class User implements Comparable{
	//用户年龄
	private int age;
	//用户姓名
	private String name;
	
	public User() {
		// TODO Auto-generated constructor stub
	}

	
	
	public User(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}



	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	//重写equals方法
	@Override
	public String toString() {
		return "User [age=" + age + ", name=" + name + "]";
	}


	//重写接口中的方法,使得按照年龄的大小进行排序
	@Override
	public int compareTo(User u) {
		return this.age-u.getAge();
	}

	
	public static void main(String[] args) {
		List list = new ArrayList<>();
		list.add(new User(25, "张三"));
		list.add(new User(18, "李四"));
		list.add(new User(24, "王五"));
		list.add(new User(32, "关羽"));
		list.add(new User(47, "张飞"));
		list.add(new User(27, "刘备"));
		
		Collections.sort(list);
		for(User u:list) {
			System.out.println(u);
		}
	}
	
}


输出结果:
User [age=18, name=李四]
User [age=24, name=王五]
User [age=25, name=张三]
User [age=27, name=刘备]
User [age=32, name=关羽]
User [age=47, name=张飞]

在一个集合中,如果集合中的元素类型没有实现comparable接口,那么就可以通过这种方式进行自定义排序规则(仅限于本类中),然后通过:collections.sort(list)进行排序,如果list中元素所在的类已经默认实现了接口,那么就会按照默认的方式进行排序。

  • 2.Comparator的使用
    同样的一个问题,一个用户类:User
package test002;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 用户类
 * @author 黄小宝
 *
 */
public class User implements Comparable{
	//用户年龄
	private int age;
	//用户姓名
	private String name;
	
	public User() {
		// TODO Auto-generated constructor stub
	}

	
	
	public User(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}



	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	//重写equals方法
	@Override
	public String toString() {
		return "User [age=" + age + ", name=" + name + "]";
	}	
}

对于一个User类型的集合

List list = new ArrayList<>();
		list.add(new User(25, "张三"));
		list.add(new User(18, "李四"));
		list.add(new User(24, "王五"));
		list.add(new User(32, "关羽"));
		list.add(new User(47, "张飞"));
		list.add(new User(27, "刘备"));
		

我们对他进行排序,因为这个User类没有实现排序的接口,所以我们可以定义一个类来实现comparator接口,代码如下:

package test002;

import java.util.Comparator;

public class MyComparator implements Comparator{

	@Override
	public int compare(User u1, User u2) {
		
		return u1.getAge()-u2.getAge();
	}

}

那么我们就可以实现对集合list的排序了:

package test002;

import java.util.ArrayList;
import java.util.List;

public class Test {
	public static void main(String[] args) {
		List list = new ArrayList<>();
		list.add(new User(25, "张三"));
		list.add(new User(18, "李四"));
		list.add(new User(24, "王五"));
		list.add(new User(32, "关羽"));
		list.add(new User(47, "张飞"));
		list.add(new User(27, "刘备"));
		
		list.sort(new MyComparator());//注:此处也可以用匿名内部类,拉姆达表达式实现
		for(User u:list) {
			System.out.println(u);
		}
	}
}

输出结果:
User [age=18, name=李四]
User [age=24, name=王五]
User [age=25, name=张三]
User [age=27, name=刘备]
User [age=32, name=关羽]
User [age=47, name=张飞]

  • **Collections.sort(list);当list中的元素没有实现comparable接口,通过list集合中元素所在的类去实现comparable接口去排序。(仅局限于在本类中排序),如果list集合中的元素已经实现了接口,那么就会按照默认的方式去进行排序,例如:字母字符串,他会按照字典 中字母的顺序进行排序。
  • **Collections.sort(list, comparator c);list中的元素没有实现comparator接口,通过匿名内部类或者拉姆达表达式或者创建外部类的方式去实现comparator接口,再对集合进行排序。(不受类的局限)
  • **list.sort(comparator c);直接对list中的元素创建一个排序标准,不管list集合的元素所在的类有没有去实现排序接口,如果实现了我们就定义一个新的标准,如果没有实现那就创建一个标准,通过匿名内部类或者拉姆达表达式或者创建外部类的方式就可以实现排序了。

好了,以上纯属个人观点,如有错误,还请指出!!!

你可能感兴趣的:(java,lambda,源码,工具)