set

Set(接口)
无序(没有下标) 不重复

HashSet

// 使用 HashSet, 主要的用途是用来去重的
// 创建 HashSet
HashSet<String> set = new HashSet<>();
// 添加
boolean add = set.add("d"); // add == true
boolean add2 = set.add("d");// add == false 添加失败,不能重复
System.out.println(add);// true
System.out.println(add2);// false
System.out.println(set);// [d]

set.add("a");
set.add("b");
set.add("c");
set.add("a");
set.add("b");
set.add("c");
// 无序(不按照存进去的顺序打印),不重复
System.out.println(set);// [a, b, c, d]
// 创建一个 hashset 添加6个人 两两一样
// 通过重写对象类的 equals 和 hashCode 方法来达到 hashSet 去重的效果
HashSet<Person> persons = new HashSet<>();
persons.add(new Person("甲", 18));
persons.add(new Person("乙", 15));
persons.add(new Person("丙", 20));
persons.add(new Person("甲", 18));
persons.add(new Person("乙", 15));
persons.add(new Person("丙", 20));
for (Person person : persons) {
	System.out.println(person);
}

linkedHashSet

linkedHashSet(HashSet 的子类)
有序(怎么存进去就怎么取出来)
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("w");
set.add("a");
set.add("n");
set.add("g");
set.add("l");
set.add("o");
set.add("n");
set.add("g");
System.out.println(set);//[w, a, n, g, l, o]
public static void main(String[] args) {
	LinkedHashSet<Integer> random = new LinkedHashSet<>();
	// 集合长度 < 10 的时候添加随机数
	while (random.size() < 10) {
		int randomNum = (int)(Math.random() * (20 - 1 + 1) + 1);
		random.add(randomNum);// 自动装箱
	}
	System.out.println(random);
}
public static void main(String[] args) {
	//  输入一个字符串,去掉其中重复字符
	System.out.println("请输入一个字符串:");
	Scanner scanner = new Scanner(System.in);
	String string = scanner.nextLine();
	char[] charArray = string.toCharArray();
	LinkedHashSet<Character> linkedHashSet = new LinkedHashSet<>();
	for (char c : charArray) {
		linkedHashSet.add(c);
	}
	System.out.println(linkedHashSet);
	scanner.close();
}
public static void main(String[] args) {
	//  利用set集合 去除ArrayList集合中的重复元素
	//  (操作原ArrayList)
	ArrayList<String> list = new ArrayList<>();
	list.add("a");
	list.add("a");
	list.add("a");
	list.add("b");
	list.add("b");
	list.add("c");
	list.add("c");
	list.add("d");
	list.add("d");
	// 创建 set 
	LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
	// 将 list 中所有元素,放入set 集合中去重
	linkedHashSet.addAll(list);
	// 清空原 list
	list.clear();
	// 把 set 中所有元素放入 list
	list.addAll(linkedHashSet);
	System.out.println(list);
	
}

TreeSet

TreeSet(内部实现二叉树)
无序 不重复 无下标
主要作用:由来排序
// 创建 TreeSet
TreeSet<Integer> set = new TreeSet<>();
set.add(1);
set.add(12);
set.add(15);
set.add(1);
set.add(4);
set.add(7);
set.add(19);
System.out.println(set);
// 系统提供一个接口 Comparable, 如果想通过TreeSet 来排序,就需要实现接口,编写排序的规则,系统才会按规则进行排序
TreeSet<Worker> set = new TreeSet<>();
set.add(new Worker("甲", 18));
set.add(new Worker("乙", 23));
set.add(new Worker("丙", 45));
set.add(new Worker("丁", 16));
for (Worker worker : set) {
	System.out.println(worker);
}

public class Worker extends Person implements Comparable<Worker>{

	public Worker() {
		super();
	}

	public Worker(String name, int age) {
		super(name, age);
	}

	// 实现接口中的唯一方法
	// 返回0时, set 中只有一个元素
	// 返回1时, 按存进去的顺序正序打印
	// 返回-1时, 按存进去的顺序倒序打印
	// TreeSet 按二叉树保存的
	// 要保存的数比它小 放在左边(返回负数)
	// 要保存的数比它打 放在右边(返回正数)
	// 要保存的数一样大 不存储
	// 打印升序(从小到大)
	/*
	 * 使用 TreeSet 排序的步骤
	 * 1.让 TreeSet 集合中保存的对象实现 Comparable 接口
	 * 2.实现 compareTo 方法
	 * 3.在 compareTo 方法中实现你要排序的规则
	 * (non-Javadoc)
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	/*
	@Override
	public int compareTo(Worker o) {
		// 按年龄比较
		// return this.getAge() - o.getAge();
		// 按姓名比较
		// return this.getName().compareTo(o.getName());
	}
	*/
	/*
	 *  比较年龄
	 *  年龄一样看姓名
	 *  (non-Javadoc)
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 
	@Override
	public int compareTo(Worker o) {
		int index = this.getAge() - o.getAge();
		return index == 0 ? this.getName().compareTo(o.getName()) : index;
	}
	*/
	
	@Override
	public int compareTo(Worker o) {
		// 比较字符串长度
		int length = this.getName().length() - o.getName().length();
		// 长度一样比年龄
		int num = length == 0 ? this.getAge() - o.getAge() : length;
		// 年龄一样比姓名
		return num == 0 ? this.getName().compareTo(o.getName()) : num;
	}
}

public class Person {
	private String name;
	private int age;
	
	public Person() {
		super();
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	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 + "]";
	}
	
	// 之后使用系统自动生成的 hashCode 和 equals 方法
	@Override
	public int hashCode() {
		// 31是个质数,只能被1和本身整除,乘法减少公约数
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	
	// 判断两个对象是否相同
	@Override
	public boolean equals(Object obj) {
		if (this == obj)// 如果两个对象地址一样
			return true;
		if (obj == null)// 如果传进来的对象是 null
			return false;
		if (getClass() != obj.getClass())// 如果两个对象不是一个类创建出来的
			return false;
		Person other = (Person) obj;// 向下转型(准备调用特有的方法)
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))// equals 使用的是 name 即字符串的比较
			return false;
		return true;
	}
	
	/*
	@Override
	public boolean equals(Object obj) {
		System.out.println();
		Person person = (Person)obj;
		return this.name.equals(person.getName()) && this.age == person.getAge();
	}
	
	// 重写 hashCode 方法
	// Set 集合在进行存储的时候
	// 当 hashCode 值相同时,会调用 equals 方法进行对比(同一个对象不存)
	// 当 hashCode 值不相同时,不会调用 equals 方法
	@Override
	public int hashCode() {
		final int num = 15;
		return this.name.hashCode() * num + this.age;
	}
	*/
	
	
	
}
/*
 *  使用比较器来排序 
 *  步骤:
 *  1.创建一个类实现 Comparator 接口
 *  2.实现接口中的方法并编写比较的规则
 *  3.把该类的对象传入 TreeSet 集合中
 */ 
TreeSet<String> set = new TreeSet<>(new KeepStringImpl());
set.add("asd");
set.add("asde");
set.add("asf");
set.add("asf");
set.add("asf");
set.add("a");
set.add("as");
set.add("w(゚Д゚)w");
// 按字符串长度排序
System.out.println(set);

class KeepStringImpl implements Comparator<String>{
	// 比较的规则
	@Override
	public int compare(String o1, String o2) {
		int length = o1.length() - o2.length();
		int num = length == 0 ? o1.compareTo(o2) : length; 
		// 存与不存取决于这个方法的返回值
		// 返回不是0的任意数表示可以存相同的字符串
		return num == 0 ? ++num : num;
	}
}
//  键盘接收一个字符串, 程序对其中所有字符进行排序
//  要求保留重复的
TreeSet<Character> set = new TreeSet<>(new KeepCharacterImpl());
System.out.println("请输入字符串");
Scanner scanner = new Scanner(System.in);
String nextLine = scanner.nextLine();
char[] charArray = nextLine.toCharArray();
for (char c : charArray) {
	set.add(c);
}
System.out.println(set);
scanner.close();

class KeepCharacterImpl implements Comparator<Character>{
	@Override
	public int compare(Character o1, Character o2) {
		int num = o1.compareTo(o2);
		return num == 0 ? 1 : num;
	}
}
/*
 * 程序启动后, 可以从键盘输入接收多个整数, 
 * 直到输入quit时结束输入. 把所有输入的整数倒序排列打印.
 */
TreeSet<Integer> set = new TreeSet<>(new KeepIntImpl());
Scanner scanner = new Scanner(System.in);
while(true) {
	System.out.println("请输入整数(输入quit时结束输入):");
	String string = scanner.nextLine();
	if (string.equals("quit")) {
		break;
	}
	int num = Integer.parseInt(string);
	set.add(num);
}
System.out.println(set);
scanner.close();

class KeepIntImpl implements Comparator<Integer>{
	@Override
	public int compare(Integer o1, Integer o2) {
		int num = o1 - o2;
		return num == 0 ? 1 : -num;
	}
}
// 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)
// 录入的学生信息格式(姓名,语文成绩,数学成绩,英语成绩)
// 按照总分从高到低输出到控制台。输出学生所有信息
// 创建容器
TreeSet<Student> set = new TreeSet<>(new KeepImpl());
Scanner scanner = new Scanner(System.in);
// 循环输入5个学生
for (int i = 1; i < 6; i++) {
	System.out.println("请输入第" + i + "个学生信息(姓名,语文成绩,数学成绩,英语成绩):");
	// 接收信息
	String nextLine = scanner.nextLine();
	// 按逗号切割字符串
	String[] split = nextLine.split(",");
	// 把信息存入 Student 中
	Student student = new Student(split[0], Integer.parseInt(split[1]), Integer.parseInt(split[2]), Integer.parseInt(split[3]));
	set.add(student);
}
// 在集合中进行排序
for (Student student : set) {
	System.out.println(student);
}
scanner.close();

class KeepImpl implements Comparator<Student>{
	@Override
	public int compare(Student o1, Student o2) {
		int num = o1.getSumScore() - o2.getSumScore();
		return num == 0 ? 1 : -num;
	}
}

public class Student {
	private String name;
	private int chineseScore;
	private int mathScore;
	private int englishScore;
	private int sumScore;

	// 构造
	public Student() {
		super();
	}
	public Student(String name, int chineseScore, int mathScore, int englishScore) {
		super();
		this.name = name;
		this.chineseScore = chineseScore;
		this.mathScore = mathScore;
		this.englishScore = englishScore;
		sumScore = chineseScore + mathScore + englishScore;
	}
	
	// get/set
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}


	public int getChineseScore() {
		return chineseScore;
	}
	public void setChineseScore(int chineseScore) {
		this.chineseScore = chineseScore;
	}
	public int getMathScore() {
		return mathScore;
	}
	public void setMathScore(int mathScore) {
		this.mathScore = mathScore;
	}
	public int getEnglishScore() {
		return englishScore;
	}
	public void setEnglishScore(int englishScore) {
		this.englishScore = englishScore;
	}
	public int getSumScore() {
		return sumScore;
	}

	@Override
	public String toString() {
		return "[姓名" + name + ", 语文成绩:" + chineseScore + ", 数学成绩:" + mathScore
				+ ", 英语成绩:" + englishScore + ", 总分:" + sumScore + "]";
	}
}