Java中集合对存入对象的排序问题

Java中集合是什么?集合是存储对象的容器。

Java中有很多中不同的集合List集合,Set集合,Map集合。那么这些集合有各自的特点。

List集合:有下标,存储对象有序,可以存放重复元素,可以存放null。

Set集合:存储对象无序,即我是第N和存进去,不一定是第N个取出来;不能存放重复元素。

Map集合:属于双列集合,<Key,Value>键值对,保证Key的一致性,就键而言,存储无序;Key不能重复。

其实存储无序表面上给人一种不知道会存放在容器的什么地方的一种不可控感,其实这是可控的。

Set集合常用的有HashSet,TreeSet,LinkedHashSet。

Map集合常用的有HashMap,TreeMap。

Hash是什么?是哈希表,也就是说,当这种集合是一种Hash集合的时候,那么他的存放是根据Hash表存放的。顺序也是Hash表确定的。Hash值越小在这个集合中越考前,理论上来说,是可以通过重写对象的HashCode方法来控制对象在集合中的存放顺序的,但是由于Hash值是正数,而且还要有模运算,所以不太好控制,所以一般情况不用Hash的集合去进行往人为需要的方向进行排序的功能。

Tree是什么呢?是二叉树,也就是说,当这个集合是一个Tree集合的时候,他是根据生成二叉树来存放对象的,这样子对于对象的排序很好控制,所以一般来说如果我们要将对象放入集合中,并且想集合能够自动帮忙排序的话,一般使用Tree集合,也就是TreeSet或者TreeMap。

那么Tree集合它对于里面存放元素的排序规则又是怎样的呢?

  1. 放入一个对象,如果在产生集合对象的时候传入了比较器(Comparator),那么通过比较器中的compare方法进行对象的比较,具体的比较的结果根据比较器的返回值确定,结果小的先出来。如果比较结果是相同的,则比较两个对象的compareTo方法。

  2. 放入一个对象,如果在产生集合对象的时候没有传入比较器(Comparator),比较两个对象的compareTo方法,结果小的最先从集合出来。

下面用代码来实现一下:

class Student implements Comparable<Student>{
	//姓名
	private String name;
	//分数
	private int point;
	public Student(String name, int point) {
		super();
		this.name = name;
		this.point = point;
	}
	public String getName() {
		return name;
	}
	public int getPoint() {
		return point;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", point=" + point + "]";
	}
	
	//=================================================
	
	//一开始只按照姓名排
	@Override
	public int compareTo(Student stu) {
		//返回负数代表小于本对象,返回正数代表大于本对象
		//成绩高的排前面
		return this.getName().compareTo(stu.getName());
	}
	
}
//用于TreeSet的比较器
class MyComparator implements Comparator<Student>{
        //比较分数,分数高的先出来
	@Override
	public int compare(Student stu1, Student stu2) {
		return stu1.getPoint()>stu2.getPoint()?-1:stu1.getPoint()<stu2.getPoint()?1:stu1.compareTo(stu2);
	}
}

//用于TreeMap的比较器
class MyComparator2<T> implements Comparator<Student>{
        //分数高的先出来
	@Override
	public int compare(Student stu1, Student stu2) {
		return stu1.getPoint()>stu2.getPoint()?-1:stu1.getPoint()<stu2.getPoint()?1:stu1.compareTo(stu2);
	}
}


public class TreeSetDemo {
	public static void main(String[] args) {
	        //TreeSet的排序案例
	        //传入比较器之前是按姓名排序,传入之后是按成绩排序
		TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
		ts.add(new Student("Kobe", 95));
		ts.add(new Student("James", 90));
		ts.add(new Student("Durant", 95));
		ts.add(new Student("Nash", 85));
		ts.add(new Student("Smith", 90));
		for (Student stu : ts) {
			System.out.println(stu);
		}
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		
		//TreeMap集合的排序案例
		MyComparator2<Student> mc = new MyComparator2<Student>();
		TreeMap<Student,String> map = new TreeMap<Student,String>();
		map.put(new Student("Zhangsan", 80), "良");
		map.put(new Student("Lisi", 90), "优");
		map.put(new Student("Wangwu", 80), "良");
		map.put(new Student("ZhaoLiu", 70), "及格");
		map.put(new Student("QianQi", 40), "不及格");
		map.put(new Student("LuBa", 100), "优");
		Set<Entry<Student, String>> set = map.entrySet();
		for (Iterator i = set.iterator(); i.hasNext();) {
			Entry<Student, String> entry = (Entry<Student, String>) i.next();
			System.out.println(entry.getKey()+"=="+entry.getValue());
		}
	}
}







转载于:https://my.oschina.net/lunqi/blog/483595

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值