Set(接口)
1.set集合储存原理
1.当hashCod值相同时会调用equal方法 进行对比 是同一个对象就不储存
2.当hashCod值不同时 不调用equals方法直接储存了
2.set集合两大特性
2.1不重复
2.11集合去重
public class text {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("d");
list.add("d");
list.add("c");
list.add("c");
list.add("a");
LinkedHashSet<String> set = new LinkedHashSet<>();
set.addAll(list);//将list所有元素任到Set中去重
System.out.println(set);
//清空
list.clear();
//再赋值给list
list.addAll(set);
System.out.println(list);
}
}
运行结果:
[a, d, c]
[a, d, c]
2.12字符串去重
public class text {
public static void main(String[] args) {
System.out.println("请输入字符串:");
Scanner scanner = new Scanner(System.in);
String dString = scanner.next();
LinkedHashSet<Character>linkedHashSet = new LinkedHashSet<>();
char[] sObject = dString.toCharArray();
for (int i = 0; i < sObject.length; i++) {
linkedHashSet.add(sObject[i]);
}
System.out.println(linkedHashSet);
}
}
2.13对象类去重
public class text {
public static void main(String[] args) {
// 通过重写对象类的equal和hasCode方法来去重
HashSet<Person> set = new HashSet<>();
set.add(new Person("泡泡",12));
set.add(new Person("泡泡",12));
set.add(new Person("哈哈",12));
set.add(new Person("哈哈",12));
set.add(new Person("飞飞",12));
// //变历set集合 查看去重效果
// Iterator<Person> iterator = set.iterator();
// while (iterator.hasNext()) {
// Person person = iterator.next();
// System.out.println(person);
// }
for(Person person : set) {
System.out.println(person);
}
}
}
运行结果:
Person [name=飞飞, age=12]
Person [name=泡泡, age=12]
Person [name=哈哈, age=12]
2.2有序
2.2.1字符排序
public class text {
public static void main(String[] args) {
// 使用hashset主要是用来去重
//创建一个HashSet
HashSet<String>set = new HashSet<>();
//添加 dd 看看效果
boolean add = set.add("s");
boolean add2 = set.add("d");
boolean add3 = set.add("a");
boolean add4 = set.add("b");
boolean add5 = set.add("c");
// 有序是怎么存的怎么打印出来
System.out.println(add);
System.out.println(add2);
System.out.println(set);
}
}
运行结果:
true
true
[a, b, s, c, d]
2.2.2数字排序.
public class text {
public static void main(String[] args) {
// 使用hashset主要是用来去重
//创建一个HashSet
HashSet<String>set = new HashSet<>();
//添加 dd 看看效果
boolean add = set.add("5");
boolean add2 = set.add("2");
boolean add3 = set.add("8");
boolean add4 = set.add("6");
boolean add5 = set.add("9");
// 有序是怎么存的怎么打印出来
System.out.println(add);
System.out.println(add2);
System.out.println(set);
}
}
运行结果:
true
true
[2, 5, 6, 8, 9]
3.定义类
3.1Work类
public class Worker extends Person implements Comparable<Worker>{
public Worker() {
super();
// TODO Auto-generated constructor stub
}
public Worker(String name, int age) {
super(name, age);
// TODO Auto-generated constructor stub
}
// 实现接口中的唯一的一个方法
/*
* 返回0时 set中只有一个元素
* 1(正数) 按存进去的顺序 正序打印
* -1(负数) 按存进去的顺序 倒序打印
*
* TreeSet 按二叉树保存的
* 要保存的数比我大 放在我的右边 (返回负数)
* 要保存的数比我小 放在我的左边 (返回正数)
* 要保存的数一样大 不储存
* 打印按从小到大输出(升序)
*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
/*
@Override
public int compareTo(Worker o) {
// 按年龄比较
return this.getAge() - o.getAge();
}
*/
// 按姓名进行比较
/*public int compareTo(Worker o) {
// 按年龄比较
return this.getName().compareTo(o.getName());
}
*/
// 比较的主要条件 按年龄
// 次要条件 按姓名
public int compareTo(Worker o) {
// 按年龄比较
/*
if((this.getAge() - o.getAge()) != 0) {
return this.getAge() - o.getAge();
}else {
return this.getName().compareTo(o.getName());
}*/
/*
* 主要比字符串长度
* 然后比年龄
* 最后比较字符串
*/
/*
if(this.getName().length() != o.getName().length()) {
return this.getName().length() - o.getName().length();
}else if((this.getAge() - o.getAge()) != 0) {
return this.getAge() - o.getAge();
}else {
return this.getName().compareTo(o.getName());
}*/
// 比较字符串长度
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;
}
}
3.2Student类
public class Student {
private String name;
private int grade1;
private int grade2;
private int grade3;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int grade1, int grade2, int grade3) {
super();
this.name = name;
this.grade1 = grade1;
this.grade2 = grade2;
this.grade3 = grade3;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade1() {
return grade1;
}
public void setGrade1(int grade1) {
this.grade1 = grade1;
}
public int getGrade2() {
return grade2;
}
public void setGrade2(int grade2) {
this.grade2 = grade2;
}
public int getGrade3() {
return grade3;
}
public void setGrade3(int grade3) {
this.grade3 = grade3;
}
@Override
public String toString() {
return "[姓名=" + name + ", 数学成绩=" + grade1 + ", 语文成绩=" + grade2 + ", 英语成绩" + grade3 + "]";
}
}
3.3Person类
public class Person {
private String name;
private int age;
public Person() {
super();
// TODO Auto-generated constructor stub
}
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; // 就返回true
if (obj == null) // 如果传进来的对象是空
return false; // 就返回false
if (getClass() != obj.getClass()) // 如果两个对象不是一个类创建出来
return false; // 就返回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)) //使用字符串类的比较 判断字符串是否相同
return false;
return true;
}
*/
// 重写equals方法
@Override
public boolean equals(Object obj) {
System.out.println("你猜猜 我执行了吗");
// TODO Auto-generated method stub
// 名字相同 和 年龄相同 就是同一个对象
Person person = (Person)obj;
return this.name.equals(person.getName()) && (this.age == person.getAge());
}
// 重写 hashCode方法
// Set集合在进行存储的时候
// 当hashCode值相同
// 会调用equals方法 进行对比 是同一个对象就不存
// 当hashCode值不相同时 没有调用equals方法 直接就存了
@Override
public int hashCode() {
// TODO Auto-generated method stub
final int num = 15;
return this.name.hashCode() * num + this.age;
}
}
3.4KeepStudent类
public class KeepStudent implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
int num1= o1.getGrade1() + o1.getGrade2() + o1.getGrade3();
int num2 = o2.getGrade1() + o2.getGrade2() + o2.getGrade3();
int num = num1 - num2;
if(num == 0) {
return 1;
}
return num;
}
}
3.5CharCompImpl类
public class CharCompImpl implements Comparator<Character>{
@Override
public int compare(Character o1, Character o2) {
// TODO Auto-generated method stub
int num = o1.compareTo(o2);
if(num == 0) {
return 1;
}
return num;
}
}
3.6Compara类
public class Compara implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
int num = o1 - o2;
if(num == 0)
return 1;
return num;
}
}
4.TreeSet(内部实现二叉树)
4.1使用TreeSet排序的步骤
1.让TreeSet集合中要保存的对象 实现Comparable接口
2.实现compareTo方法
3.在compareTo方法 实现 你要排序的规则
4.1创建一个TreeSet遍历
public class text {
public static void main(String[] args) {
// 创建一个TreeSet
TreeSet<Integer> set = new TreeSet<Integer>();
set.add(1);
set.add(11);
set.add(1);
set.add(2);
set.add(3);
System.out.println(set);
// 遍历
for(Integer integer : set) {
System.out.println(integer);
}
}
}
运行结果:
[1, 2, 3, 11]
1
2
3
11
创建TreeSet集合 保存4个工人
系统给你留了接口Comparable 如果你想通过TreeSet来排序
你就实现这个接口 编写排序规则 系统就会按规则来排序
4.2按
public class text {
public static void main(String[] args) {
TreeSet<Worker> set = new TreeSet<>();
set.add(new Worker("张三",23));
set.add(new Worker("王五",15));
set.add(new Worker("李四",15));
set.add(new Worker("赵六",16));
// for(Worker worker : set) {
// //
// System.out.println(worker);
// }
System.out.println(set);
//System.out.println((int) '张')
}
}
运行结果:
[Person [name=李四, age=15], Person [name=王五, age=15], Person [name=赵六, age=16], Person [name=张三, age=23]]
********************************************
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;
}
/*
* 使用比较器来排序
* 1.创建一个类 实现 comparator类
* 2.实现接口中的方法 并编写 比较的规则
* 3.把该类的对象 传人 TreeSet集合中
*/
// 使用比较器来排序
TreeSet<String>set = new TreeSet<>(new StringLengththCompareImpl());
set.add("asd");
set.add("asde");
set.add("asdef");
set.add("as");
//按字符串长度排序
System.out.println(set);
运行结果:
[as, asd, asde, asdef]
class StringLengththCompareImpl implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
int num = o1.length() - o2.length();
return num == 0? o1.compareTo(o2):num;
}
}