2021-04-12

Set\比较器

1.集合

1.1set

无序,不可重复
1.1.1Treeset
1.1.1.1概述
会按某种顺序进行排序
比较器有两种:要添加的元素实现比较器,专门准备一个比较器类(优先级高)
进行排序的时候根据返回值进行比较
如果是0说明重复,不添加,大于0,元素大往后放,小于0,往前放
1.1.1.2基本使用
set.add();
set.size();
set.contains();
set.isEmpty();
set.remove:
1.1.1.3注意
如果使用treeset那么元素必须要比较器,两种都可以
否则有类型转换异常
1.要添加的元素实现Comparable接口并实现compareTo方法
2.写一个比较器类,实现Comparator比较器接口
很多常用类中都实现了Comparable接口并实现了compareTo方法、
所以自定义类型的时候,一定要弄比较器类
1.1.2比较器
可以让集合的元素按某一规则进行排序
源码中,先判断是否有compare()如果没有再判断是否有compareTo()
1.1.2.1Comparable
也可以叫元素自身比较器,就是要添加的元素需要实现这个接口,一般在我们的自定义类中常用
因为这种方式,直接让要添加的元素类实现接口就可以,编码方便,而Comparator需要单独写比较器类
因为它优先级低,我们给出的排序规则,如果不满足调用处,它还可以根据Comparator进行排序扩展
此时当调用处进行排序扩展的时候,此时Comparator和Comparable同时存在,则Comparator优先级高,所以最终排序规则会按照调用处指定的规则进行排序
public static void main(String[] args) {
//有3头牛,有编号、名称、年龄属性,按年龄升序排列后,输出排列前、排列后的集合内容。
List< Cow> list=new ArrayList();
Cow Cow1=new Cow(2, “小红”, 2);
Cow Cow2=new Cow(3, “小名”, 2);
Cow Cow3=new Cow(1, “小花”, 2);
list.add(Cow1);
list.add(Cow2);
list.add(Cow3);
Iterator iterator =list.iterator();
while (iterator.hasNext()) {
Object e=iterator.next();
System.out.println(e);
//按id排序
}
Collections.sort(list);
for (Object object : list) {
System.out.println(object);
}

}
}

class Cow implements Comparable{
private int id;
private String name ;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Cow(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}

@Override
public String toString() {
	return "Cow [id=" + id + ", name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Cow c) {
	if (c.getId()<this.id) {
		return  1;
		
	}else if (c.getId()==this.id) {
		return 0;
	}else {
		return -1;
	}
}	
}

1.1.2.2Comparator
1 该类有排序(比如Integer实现了Comparable,并且是升序),但是排序规则不是我们想要的,这个时候需要使用Comparator来进行调整排序,因为优先级高
2 如果该类没有排序(没有实现Comparable接口),该类也不是我们写的,如果此时需要排序,则需要使用Comparator来完成
public static void main(String[] args) {
List users = new ArrayList();
User user1 = new User(12, “小萝莉”);
User user2 = new User(46, “大叔”);
User user3 = new User(78, “大爷”);
users.add(user3);
users.add(user1);
users.add(user2);

	Collections.sort(users,new Comparator() {
		@Override
		public int compare(Object o1, Object o2) {
			// 排序规则
			User u1 = (User) o1;
			User u2 = (User) o2;
			return u1.getage() - u2.getage();
		}
	});
	

	for (Object object : users) {
		System.out.println(object);
	}
}

}
class User {
private String name;
private int age;

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

public User() {
	super();
}

public String getName() {
	return name;
}

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

public int getage() {
	return age;
}

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

@Override
public String toString() {
	return "姓名 : " + name + " , 年龄 : " + age;
}

}

1.2泛型

1.2.1概述
类型检查,编译过程中检查类型是否匹配
优点:减少了类型转换
缺点:类型单一
泛型:只能是引用类型,不能是基本类型
1.2.2基本使用
1.2.3自定义泛型
泛型本质就是一个占位符,由调用处对这个占位符赋值
不赋值默认是Object

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值