TreeSet和HashSet不同,底层是二叉树,可以保证输出有序

二叉树,小的存储在左边(负数),大的在右边(正数),相等就不存

  1. 返回0,集合中只有一个元素(保证输出唯一,比如属性值相同的对象,就返回0
  2. 返回-1,集合倒叙
  3. 返回1,怎么存怎么取(和根元素比较)

两种方法保证输出有序:

  1. 自然排序:用于自己创建的类的时候,让类implements Comparable,然后重写compareTo()方法。
  2. 比较器排序:直接再调用TreeSet的有参构造,创建接口Comparator的匿名子类对象(在直接作用输入的String/Integer对象的时候,不涉及到自己创建的类的时候可用,同时存在,比自然排序优先)

javaSE (二十五)TreeSet原理、自然排序和选择器排序的比较、TreeSet几个练习

直接上几个练习:

collectionTest1();
在一个集合中存储无序且重复的字符串,定义一个方法,让其有序(字典顺序),而且不能去除重复
collectionTest2();
从键盘接受一个字符串,进行排序,如键盘输入:helloitcast 打印:acehillostt 分析:还是字典顺序,并且没有去除重复
collectionTest3();
键盘输入多个整数,输入quit时结束,把输入倒叙打印
collectionTest4();
键盘输入五个学生的信息,姓名,语数外,按照总分从高到低输出到控制台 


package cn.xinhua;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;

/*
 * 问题:在一个集合中存储无序且重复的字符串,定义一个方法,让其有序(字典顺序),而且不能去除重复
 * 注:我一开始想用修改compareTo的方法的,但是发现这个不是我们自己创建的类啊,不能直接继承Comparable接口,所以就直接在TreeSet的构造函数里加上实现了Comparator接口的匿名类
 * 
 */

public class CollectionTest {
	
	public static void main(String[] args) {
		collectionTest1();
		collectionTest2();
		collectionTest3();
		collectionTest4();

	}

	public static void collectionTest4() {
		TreeSet<Student> tree = new TreeSet<>();
		
		tree.add(new Student("周杰伦", 22, 33, 44));
		tree.add(new Student("周杰伦", 22, 33, 44));
		tree.add(new Student("吴彦祖", 11, 22, 33));
		tree.add(new Student("陈奕迅", 55, 66, 77));
		tree.add(new Student("林宥嘉", 33, 44, 55));

		for (Student student : tree) {
			System.out.println(student);
		}
	}

	public static void collectionTest3() {
		Scanner sc = new Scanner(System.in);
		TreeSet<Integer> tree = new TreeSet<>(new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO Auto-generated method stub
				// return -1;
				int num = o1.compareTo(o2);
				return num == 0 ? 1 : num;

			}

		});

		System.out.println("请输入整数,结束输入:quit");

		while (true) { // 都以字符串形式输入

			// if(sc.nextLine() == "quit") {
			String s = sc.nextLine();
			if ("quit".equals(s)) {
				break;
			} else {
				tree.add(Integer.parseInt(s));
			}

		}

		for (Integer integer : tree) {
			System.out.println(integer);
		}
	}

	public static void collectionTest2() {
		TreeSet<Character> tree = new TreeSet<Character>(new Comparator<Character>() {

			@Override
			public int compare(Character o1, Character o2) {
				int num = o1.compareTo(o2);
				return num == 0 ? 1 : num;
			}

		});

		Scanner sc = new Scanner(System.in);
		System.out.println("老铁,请输入一个字符串:");
		String str = sc.nextLine();
		char[] cha = str.toCharArray();

		for (char c : cha) {
			tree.add(c);
		}

		for (char c : tree) {
			System.out.print(c);
		}
	}

	public static void collectionTest1() {
		List<String> list = new ArrayList<String>();
		list.add("vvvv");
		list.add("zzzzzz");
		list.add("vvvv");
		list.add("gdagg");
		list.add("rrrrr");
		list.add("gdagg");
		list.add("ppppp");

		TreeSet<String> tree = new TreeSet<>(new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				// TODO Auto-generated method stub
				return o1.compareTo(o2) != 0 ? o1.compareTo(o2) : o1.compareTo(o2) + 1; // +1防止变为0,我真他两的是个天才
			} // 不需要在下面创建子类了,直接new Comparator<String>()创建接口的子类对象

		});
		for (String string : list) {
			tree.add(string);
		}

		for (String string : tree) {
			System.out.println(string);
		}
	}

}

练习4中的Student类:

package cn.xinhua;

public class Student  implements Comparable<Student>{
	private String name;
	private int Ygrade;
	private int Sgrade;
	private int Wgrade;
	public Student() {
		super();
		
	}
	public Student(String name, int ygrade, int sgrade, int wgrade) {
		super();
		this.name = name;
		Ygrade = ygrade;
		Sgrade = sgrade;
		Wgrade = wgrade;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getYgrade() {
		return Ygrade;
	}
	public void setYgrade(int ygrade) {
		Ygrade = ygrade;
	}
	public int getSgrade() {
		return Sgrade;
	}
	public void setSgrade(int sgrade) {
		Sgrade = sgrade;
	}
	public int getWgrade() {
		return Wgrade;
	}
	public void setWgrade(int wgrade) {
		Wgrade = wgrade;
	}
	@Override
	public int compareTo(Student o) {
		int sum1 = o.Sgrade + o.Wgrade + o.Ygrade;	//输入的对象
		int sum2 = this.Sgrade + this.Wgrade + this.Ygrade;  //当前的对象
		return (sum1 - sum2 == 0) ?  0 : (sum1 > sum2 ? 1 : -1);}
	
	@Override
	public String toString() {
		return "Student [name=" + name + ", Ygrade=" + Ygrade + ", Sgrade=" + Sgrade + ", Wgrade=" + Wgrade + "]";
	}

	
	
	
}

相关文章: