Set接口
- 概述:一个不包含重复元素的 collection。
- 实现类HashSet:
HashSet 底层数据结构是哈希表. HashSet 不是线程安全的 集合元素可以是 null
HashSet 元素无序(存取顺序不一致),且唯一(元素不能重复)
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
HashSet<String> Hashset = new HashSet<>();
Hashset.add("aaa");
Hashset.add("bbb");
Hashset.add("ccc");
Hashset.add("111");
Hashset.add("222");
Hashset.add("333");
Hashset.add("333");
Hashset.add("333");
Hashset.add(null);
for (String s : Hashset) {
System.out.println(s);
}
}
}
HashSet储存对象
public class Test {
public static void main(String[] args) {
HashSet<Student> students = new HashSet<>();
students.add(new Student("一一",19));
students.add(new Student("一一",19));
students.add(new Student("一一",12));
students.add(new Student("二二",16));
students.add(new Student("三三",16));
students.add(new Student("四四",18));
students.add(new Student("五五",21));
for (Student student : students) {
System.out.println(student);
}
}
}
class Student{
private String name;
private int 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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 实现类LinkedSet
LinkedHashSet 底层数据结构是链表和哈希表 元素有序且唯一 链表保证了有序,哈希表保证了唯一
线程不安全效率高
public class Test {
public static void main(String[] args) {
LinkedHashSet<String> LinkedHashSet = new LinkedHashSet<>();
LinkedHashSet.add("aaa");
LinkedHashSet.add("bbb");
LinkedHashSet.add("ccc");
LinkedHashSet.add("ddd");
LinkedHashSet.add("eee");
LinkedHashSet.add("fff");
LinkedHashSet.add("ggg");
LinkedHashSet.add("hhh");
LinkedHashSet.add("000");
LinkedHashSet.add("jjj");
for (String s : LinkedHashSet) {
System.out.println(s);
}
}
}
- 实现类TreeSet
TreeSet 元素唯一,且可以对元素进行排序
底层数据结构是二叉树
public class Test{
public static void main(String[] args) {
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(10);
treeSet.add(31);
treeSet.add(28);
treeSet.add(19);
treeSet.add(17);
treeSet.add(58);
treeSet.add(400);
treeSet.add(874);
treeSet.add(10);
treeSet.add(10);
for (Integer integer : treeSet) {
System.out.println(integer);
}
}
}
1
两种排序方法:自然排序,比较器排序
自然排序:利用TreeSet的空参构造
所对比的元素必须实现Compareable接口否则无法自然排序
public class Test1 {
public static void main(String[] args) {
TreeSet<Student> students = new TreeSet<>();
students.add(new Student("A同学",19));
students.add(new Student("A同学",19));
students.add(new Student("B同学",19));
students.add(new Student("C同学",18));
students.add(new Student("D同学",21));
students.add(new Student("E同学",23));
students.add(new Student("F同学",22));
for (Student student : students) {
student.show();
}
}
}
class Student implements Comparable<Student>{
private String name;
private int 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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show(){
System.out.println(this.name+"-----"+this.age);
}
@Override //重写排序方法,从大到小
public int compareTo(Student student) {
int num1=this.age-student.age;
int num2=num1==0?this.name.compareTo(student.name):num1;
return -num2;
}
}
比较器排序:采用有参构造,在创建TreeSet对象时,需要传入一个Comparetor 比较器,重写比较器里面的compare方法,根据此方法的返回值的正负 0,来决定元素的放置顺序
//TreeSet(Comparator < ? super E > comparator)
//构造一个新的空 TreeSet,它根据指定比较器进行排序。
//Comparator<T> 比较器
//int compare (T o1, T o2)
//比较用来排序的两个参数。
public class Test {
public static void main(String[] args) {
TreeSet<Student> students = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student stu1, Student stu2) {
int num1=stu1.getAge()-stu2.getAge();
int num2=num1==0?stu1.getName().compareTo(stu2.getName()):num1;
return num2;
}
});
students.add(new Student("A同学",19));
students.add(new Student("A同学",19));
students.add(new Student("B同学",19));
students.add(new Student("C同学",18));
students.add(new Student("D同学",21));
students.add(new Student("E同学",23));
students.add(new Student("F同学",22));
for (Student student : students) {
student.show();
}
}
}
class Student {
private String name;
private int 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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show(){
System.out.println(this.name+"-----"+this.age);
}
}
生成10个1-100间的随机数元素不重复且排序
public class Test {
public static void main(String[] args) {
Random random = new Random();
TreeSet<Integer> treeSet = new TreeSet<>();
while(treeSet.size()<10){
int i = random.nextInt(100)+1;
treeSet.add(i);
}
for (Integer integer : treeSet) {
System.out.print(integer+" ");
}
}
}
输入三个学生的姓名和成绩 并从小到大输出
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet<Student> students = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student stu1, Student stu2) {
int num1=stu1.getTotalScore()-stu2.getTotalScore();
int num2=num1==0?stu1.getName().length()-stu2.getName().length():num1;
int num3=num2==0?stu1.getName().compareTo(stu2.getName()):num1;
return num3;
}
});
Scanner sc = new Scanner(System.in);
for (int i = 1; i <= 3; i++) {
Student student = new Student();
System.out.println("请输入第"+i+"个学生的姓名");
sc=new Scanner(System.in);
String name=sc.nextLine();
student.setName(name);
System.out.println("请输入第"+i+"个学生的语文成绩");
int ChineseScore=sc.nextInt();
student.setChineseScore(ChineseScore);
System.out.println("请输入第"+i+"个学生的数学成绩");
int MathScore=sc.nextInt();
student.setMathScore(MathScore);
System.out.println("请输入第"+i+"个学生的英语成绩");
int EnglishScore=sc.nextInt();
student.setEnglishScore(EnglishScore);
students.add(student);
}
System.out.println("序号"+"\t"+"\t"+"姓名"+"\t"+"\t"+"语文成绩"+"\t"+"\t"+"数学成绩"+"\t"+"\t"+"英语成绩"+"\t"+"\t"+"总成绩");
int index=1;
for (Student student : students) {
System.out.println(index+"\t"+"\t"+student.getName()+"\t"+"\t"+"\t"+student.getChineseScore()+"\t"+"\t"+"\t"+student.getMathScore()+"\t"+"\t"+"\t"+student.getEnglishScore()+"\t"+"\t"+"\t"+student.getTotalScore());
index++;
}
}
}
class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int ChineseScore;
private int MathScore;
private int EnglishScore;
private int TotalScore;
public Student() {
}
public int getChineseScore() {
return ChineseScore;
}
public void setChineseScore(int chineseScore) {
ChineseScore = chineseScore;
}
public int getMathScore() {
return MathScore;
}
public void setMathScore(int mathScore) {
MathScore = mathScore;
}
public int getEnglishScore() {
return EnglishScore;
}
public void setEnglishScore(int englishScore) {
EnglishScore = englishScore;
}
public int getTotalScore() {
int TotalScore=ChineseScore+MathScore+EnglishScore;
return TotalScore;
}
}