关于TreeSet和TreeMap排序问题及实例

本文介绍了Java中TreeSet和TreeMap的排序问题,包括默认的自然排序和如何使用比较器进行自定义排序。在默认情况下,TreeSet和TreeMap会根据元素的自然顺序进行排序,当元素类型不一致时会导致排序错误。同时,文章通过实例展示了如何通过Comparator或Comparable接口来实现自定义排序,如按年龄倒序排列。

关于TreeSet和TreeMap排序问题

1.默认的自然排序

  • 对于字符的排序是a-z,大写字母优于小写字母
  • 对于数字默认是从小到大
    如果TreeSet中既放入字符,又放入数字,会报错,即无法进行比较排序的错误
    java.lang.ClassCastException:
    java.lang.String cannot be cast to java.lang.Integer

1.TreeSet实例:

a.字母

	Set treeSet = new TreeSet();
	treeSet.add("sd");
	treeSet.add("rt");
	treeSet.add("vc");
	
System.out.println(treeSet);

>>>[rt, sd, vc]

大小写

	Set treeSet = new TreeSet();
	treeSet.add("b");
	treeSet.add("a");
	treeSet.add("A");
	treeSet.add("c");
	
System.out.println(treeSet);

>>>[A, a, b, c]

b.数字

	Set treeSet = new TreeSet();
	treeSet.add(3);
	treeSet.add(5);
	treeSet.add(4);
	treeSet.add(2);
	
System.out.println(treeSet);

>>>[2, 3, 4, 5]

2.TreeMap实例:

默认是使用key值进行排序
a.字符

	Map map = new TreeMap();
	map.put("v",55);
	map.put("b",50);
	map.put("c",51);
	map.put("a",54);

System.out.println(map);

>>>{a=54, b=50, c=51, v=55}

大小写

        Map map = new TreeMap();
        map.put("c",55);
        map.put("a",50);
        map.put("A",51);
        map.put("b",54);
System.out.println(map);

>>>{A=51, a=50, b=54, c=55}

b.数字

	Map map = new TreeMap();
	map.put(30,55);
	map.put(20,50);
	map.put(40,51);
	map.put(15,54);
	
System.out.println(map);

>>>{15=54, 20=50, 30=55, 40=51}

2.使用比较器

使用比较器有两种方式:

  • 在创建TreeSet或者TreeMap时直接使用匿名对象Comparator(),重写compare方法
//TreeSet
Set treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
        });
        
//TreeMap
Map map = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
        });
  • 在要放入 TreeSet或者TreeMap的具体对象的类实现接口Comparable,并重写compareTo方法
class Cust implements Comparable{
	@Override
	    public int compareTo(Object o) {
	        return 0;
	    }
}

具体实例:
TreeSet
//实现对象按年龄倒序排列

	Set treeSet = new TreeSet(new Comparator() {
	   @Override
	   public int compare(Object o1, Object o2) {
	       Cust cust1 = (Cust)(o1);
	       Cust cust2 = (Cust)(o2);
	
	       return cust2.getAge()-cust1.getAge();
	   }
	});
	treeSet.add(new Cust("asd",5));
	treeSet.add(new Cust("asd",4));
	treeSet.add(new Cust("asd",3));
	treeSet.add(new Cust("asd",7));
	
System.out.println(treeSet);

>>>[Cust{name='asd', age=7}, Cust{name='asd', age=5}, Cust{name='asd', age=4}, Cust{name='asd', age=3}]

TreeMap
//实现对象按年龄倒序排列

	Map map = new TreeMap(new Comparator() {
	    @Override
	    public int compare(Object o1, Object o2) {
	        Cust cust1 = (Cust)(o1);
	        Cust cust2 = (Cust)(o2);
	        return cust2.getAge()-cust1.getAge();
	    }
	});
	map.put(new Cust("asd",5),4);
	map.put(new Cust("asd",8),2);
	map.put(new Cust("asd",4),1);
	
System.out.println(map);

>>>{Cust{name='asd', age=8}=2, Cust{name='asd', age=5}=4, Cust{name='asd', age=4}=1}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值