Set 接口
一个不包含重复元素的集合 并且还是无序的(无下标)
Set 接口继承 Collection 接口 内部实现方法相同 在此不再赘述
HashSet
是set 的实现类 利用HashSet 进行去重
创建一个人类对象 (不再演示)
// 利用HashSet 进行去重对象
HashSet<Person> set = new HashSet<>();
set.add(new Person("james", 18));
set.add(new Person("james", 18));
set.add(new Person("Tom", 17));
set.add(new Person("Tom", 17));
set.add(new Person("Jerry", 18));
set.add(new Person("Jerry", 18));
// 遍历Set
Iterator<Person> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// 这里如果直接运行的话 输出结果并不是我们所想要的
//通过分析我们得知 当Set集合在进行存储的时候 HashCode值相同 会调用 equals方法进行对比 是同一个对象就不存 当HashCade不相同时 没有调用 equals 因此 我们需要通过重写 HashCode 和 equals方法
@Override
public int hashCode() {
// 质数
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) {
// 如果两个对象 地址一样就返回 true
if (this == obj)
return true;
// 传进来的对象是空 返回false
if (obj == null)
return false;
// 如果两个对象不是一个类创建出来的 就返回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)) // 使用String 类的equals比较判断
return false;
return true;
}
linkedHashSet
是HashSet的子类 有序 怎么存的就能怎么取出
例题练习:
// 输入一串字符串 去掉重复的字符
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
LinkedHashSet<Character> linkSet = new LinkedHashSet<>();
char[] charArray = string.toCharArray();
for (int i = 0; i < charArray.length; i++) {
linkSet.add(charArray[i]);
}
System.out.println(linkSet);
TreeSet(内部二叉树)
无序 不重复 无下标 主要作用 用来排序
代码示例:
//创建一个学生类
// 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)
// 录入的学生信息格式(姓名,语文成绩,数学成绩,英语成绩)
// 按照总分从高到低输出到控制台。输出学生所有信息
Scanner scanner = new Scanner(System.in);
TreeSet<Student> set = new TreeSet<>( new ScoreComper());
while (set.size() < 5) {
String string = scanner.nextLine();
// 按逗号切割
String[] split = string.split(",");
// 把成绩取出来
int chinese = Integer.parseInt(split[1]);
int math = Integer.parseInt(split[2]);
int english = Integer.parseInt(split[3]);
set.add(new Student(split[0], chinese, math, english));
}
for (Student student : set) {
System.out.println(student);
}
// 这里如果想进行排序 有两种方法 第一种使用系统给出的一个接口 来实现排序 Comparable
Student类里 实现接口 Comparable<Student> 然后 实现compareTo方法
@Override
public int compareTo(Student o) {
if (this.getTotalScore() - o.getTotalScore() == 0) {
return 1;
}
return this.getTotalScore() - o.getTotalScore();
}
//第二种比较方法 使用TreeSet 中的构造方法 Comparator 来实现
// 使用比较器 来排序 的步骤
// 1.创建一个类 实现 Comparator 接口
// 2.实现接口中的方法 并编写比较的规则
// 3.把该类的对象 传入 TreeSet集合中
// 创建一个比较器类 专门来做字符串的长度比较
// 实现Comparator 接口 并实现方法
class Compare implements Comparator<Student>{
// 三目运算法
int num = o1.getTotalScore() - o2.getTotalScore();
return num == 0 ? 1:num;
}