Set接口

Set接口

  1. 概述:一个不包含重复元素的 collection。
  2. 实现类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 +
                '}';
    }
}

在这里插入图片描述

  1. 实现类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);
        }
    }
}

在这里插入图片描述

  1. 实现类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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值