JAVA高级基础(9)---Set的典型实现(二):TreeSet

本文介绍了Java中TreeSet的排序方式,包括自然排序和定制排序。TreeSet基于TreeMap实现,不保证线程安全。对于自然排序,元素需要实现Comparable接口,通过compareTo()方法进行比较;对于定制排序,可以通过实现Comparator接口来定义排序规则,可以采用外部类、内部类或匿名内部类的方式实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TreeSet

TreeSet是基于TreeMap实现的。不是线程安全的。TreeSet可以使用元素的自然顺序进行排序,或者定制排序

注:更多详细方法请自行在 API 上查找

排序方式

                  自然排序、定制排序

自然排序

实现 Comparable 接口,需要实现其 comparaTo() 方法。
                 Integer类:
                               compareTo(Integer o)
                               this  == o  返回0   this > o 返回大于0的值,   this < o  返回小于0的值
                 String类  :
                              compareTo(String str)
                             按照字典顺序(字母表的顺序)进行字符串的比较        本质上比较的是字符的 Unicode 值

package org.lanqiao.setdemo;

public class Student {
	private String name;
	private Integer age;
	public Student() {
	}
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	/*
	
	 * 实现compareTo方法。则是根据我们的比较规则,来定义,针对我们自己自定义的类型
	 * 进行比较的方式
	 * 1 我认为。如果两个同学的年龄相等的话,那么这两个同学就是同一个人
	 * 2 如果年龄相等,则按照姓名的字典顺序进行排序
	 */
	/*@Override
	public int compareTo(Object o) {
		Student st = (Student)o;
		int res =  age.compareTo(st.getAge());
		if(res == 0) {
			res =  name.compareTo(st.getName());
			
		}
		return res;
		
	}*/
	
}
package org.lanqiao.setdemo;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {
	/*
	 * TreeSet 可以对存入其中的元素进行排序
	 * 排序的方式由两种:自然排序,定制排序
	 * 自然排序:实现Comparable
	 */
	public static void main(String[] args) {
		Set set = new TreeSet();
		/*set.add(2);
		set.add(5);
		set.add(1);
		set.add(6);
		set.add(9);*/
		/*set.add("b");
		set.add("cd");
		set.add("bcd");
		set.add("abcd");*/
		/*Student stu1 = new Student("aa",21);
		Student stu2 = new Student("dd",18);
		Student stu3 = new Student("cc",18);
		Student stu4 = new Student("bb",22);
		Student stu5 = new Student("ff",19);
		set.add(stu1);
		set.add(stu2);
		set.add(stu3);
		set.add(stu4);
		set.add(stu5);*/
		set.add("李四");
		set.add("王五");
		set.add("张三");
		Iterator iter = set.iterator();
		while(iter.hasNext()) {
			System.out.println(iter.next());
			
		}
		char a = '张';
		System.out.println((int)a);
		char b = '王';
		System.out.println((int)b);
		char c = '李';
		System.out.println((int)c);
	}
}

定制排序

不是由存储的数据类型来决定数据的排序方式,而是将数据的排序的方式交由容器来定义,不同的容器可以选择不同的排序方式。

实现Comparator接口,实现 compare()

package org.lanqiao.setdemo;

import java.util.Comparator;

public class MyComparetor  implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		Integer i1 = (Integer)o1;
		Integer i2 = (Integer)o2;
		return i1.compareTo(i2);
	}

}
package org.lanqiao.setdemo;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo2 {
	public static void main(String[] args) {
		Set  set = new  TreeSet(new Comparator() {

			@Override
			public int compare(Object o1, Object o2) {
				Student st1 = (Student)o1;
				Student st2 = (Student)o2;
				int res =  st1.getAge().compareTo(st2.getAge());
				if(res == 0) {
					res =  st1.getName().compareTo(st2.getName());
					
				}
				return res;
			}
			
			
		}) ;
		/*set.add(1);
		set.add(5);
		set.add(2);
		set.add(6);
		set.add(4);*/
		Student stu1 = new Student("aa",21);
		Student stu2 = new Student("dd",18);
		Student stu3 = new Student("cc",18);
		Student stu4 = new Student("bb",22);
		Student stu5 = new Student("ff",19);
		set.add(stu1);
		set.add(stu2);
		set.add(stu3);
		set.add(stu4);
		set.add(stu5);
		Iterator iter = set.iterator();
		
		while(iter.hasNext()) {
			System.out.println(iter.next());
			
		}
	}
	/*public class MyComparetor2  implements Comparator{

		@Override
		public int compare(Object o1, Object o2) {
			Integer i1 = (Integer)o1;
			Integer i2 = (Integer)o2;
			return i1.compareTo(i2);
		}

	}*/
}

实现方式有三种:

  1. 使用外部类来实现接口
  2. 使用内部类来实现接口
  3. 使用匿名内部类来实现接口

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. Set(集合)里面的元素是无序的,但没有重复的元素 2. 两个实现类HashSet(LinkHashSet)和TreeSet,TreeSet排序功能(Set set=new TreeSet();set.add(new Integer(8)); set.add(new Integer(4)); set.add(new Integer(7));)输出后的结果是:4 7 8 Eg: package test; import java.util.*; public class Set{ public static void main(String[] args) { //先实例化一个set Set<String> stringSet=new HashSet<String>(); //向set里面添加元素 stringSet.add("123"); stringSet.add("wer"); stringSet.add("345"); //将set里的元素取出 Iterator<String> stringIter=stringSet.iterator(); while(stringIter.hasNext()){ String str=stringIter.next(); System.out.println(str); System.out.println("~~~~~~~~~~~"); } System.out.println("stringSet里面有"+stringSet.size()+"元素"); } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2.List(列表<接口>)以线性方式存储,有序,允许重复主要实现类有LinkList(采用链表数据结构)和ArrayList(代表可大可小的数组) Eg: package test; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; public class Map { public static void main(String[] args) { List list=new ArrayList(); list.add(10); list.add(2); list.add(34); //对list数组进行自然排序 Collections.sort(list); //依次检索输出list的所有对象 // for(int i=0;i<list.size();i++){ // System.out.println(list.get(i)); // } Iterator Iter=list.iterator(); while(Iter.hasNext()){ System.out.println(Iter.next()); } } } 3.Map(映射<集合>)是无序的,是一种把键对象和值对象进行映射的集合,它每一个元素都包含一对键对象和值对象,给出键对象就可以得到值对象,键对象不允许重复,对值没有要求,多个任意键对象可以映射到一个值对象上;如果有相同键对象,最后一次加入的键对象和值对象将会覆盖以前的; Eg: package test; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class NewMap { public static void main(String[] args) { //向map里添加键值对 //如果要对键进行排序Map map=new TreeMap(); Map<Integer,String> map=new TreeMap<Integer,String>(); //Map map=new HashMap(); map.put(1, "yi"); map.put(23, "er"); map.put(12, "san"); map.put(3, "si"); //遍历map Set keys=map.keySet(); Iterator<Integer> stringIter=keys.iterator(); while(stringIter.hasNext()){ int key=stringIter.next(); String value=(String) map.get(key);//根据键key得到value的值 System.out.println(key+"---"+value); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值