对集合中的对象进行排序(Comparable接口与Comparator接口)

1. 有的时候需要对集合中的对象进行排序,其中有两种方法可以对集合中的对象按照某种自定义的规则来进行排序

① 方法一:在集合的元素(对象)中实现Comparable接口

首先要创建一个User对象, 并且实现Comparable接口

package ListDemo;
//注意User对象上面不能够写<User>否则后面会导致传进去的对象不能够调用get方法
public class User implements Comparable<User>{
	//这种方法是在集合的对象上实现Comparable接口来实现自定义的排序
	private String username;
	private String password;
	private int age;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public User(String username, String password, int age) {
		this.username = username;
		this.password = password;
		this.age = age;
	}
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public int compareTo(User o){
		//return this.getAge() - o.getAge();
		return this.getUsername().compareTo(o.getUsername());
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + ", age=" + age + "]";
	}
}

其中compareTo方法是实现Comparable接口需要实现的方法,我们在这个方法里面来自定义排序规则

测试:

package ListDemo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class ComparableTest{
	public static void main(String[] args) {
		List<User> users = new ArrayList<User>();
		users.add(new User("zhangsan", "2313321", 20));
		users.add(new User("lisi", "55372721", 10));
		users.add(new User("wangwu", "883321", 30));
		Iterator<User> iterator = users.iterator();
		System.out.println("排序之前: ");
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
		System.out.println("排序之后: ");
		Collections.sort(users);
		iterator = users.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
	}
}

我们可以使用JavaAPI中的迭代器Iterator来遍历和输出集合中的元素,使用迭代器的好处是我们可以多次进行迭代操作

下面是按照按照用户名字的字典序的顺序进行排序的,结果如下:

② 方法二:直接在Collections的方法中传入比较器Comparator来自定义比较规则,下面是测试程序

package ListDemo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
public class ComparatorTest{
	public static void main(String[] args) {
		List<User> users = new ArrayList<User>();
		users.add(new User("zhangsan", "2144241", 39));
		users.add(new User("lisi", "747271", 89));
		users.add(new User("wangwu", "31288128", 59));
		Iterator<User> iterator = users.iterator();
		System.out.println("排序之前");
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
		System.out.println("排序之后");
		Collections.sort(users, new Comparator<User>(){
			@Override
			public int compare(User o1, User o2) {
				//return o1.getUsername().compareTo(o2.getUsername());
				return o1.getAge()- o2.getAge();
			}
		});	
		iterator = users.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
	}
}

下面是按照年龄排序的结果:

其中需要实现compare方法,里面自定义比较规则

对于方法一实现集合对象的排序可能会造成一定的耦合,而方法二的话则不会直接传入一个比较器就可以了,所以来说耦合是比较低的而且比较方便

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值