set接口的特点?set接口的实现类有哪些?他们的底层实现是什么?分别有什么特点?在List集合内去除重复数字值?

请说明set接口的特点?

元素存取无序,没有索引、只能通过迭代器或增强 for 循环遍历,不能存储重复元素。

set接口的实现类有哪些?他们的底层实现是什么?分别有什么特点?

  • HashSet 集合,底层实现是哈希表,特点:集合元素可以是 null;对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致;没有索引,只能通过迭代器或增强 for 循环遍历;不包含重复元素,保证元素唯一性

  • LinkedHashSet,底层:哈希表和链表;特点:链表保证元素有序,也就是说元素的存储和取出顺序是一致的;哈希表保证元素唯一,也就是说没有重复的元素

  • TreeSet,底层数据结构是二叉树;特点:元素有序,可以按照一定的规则进行排序;集合中元素唯一; 没有索引、只能通过迭代器或增强 for 循环遍历

TreeSet 的排序方式有哪两种?

  • 自然排序Comparable
  • 比较器排序Comparator

在List集合内去除重复数字值,要求尽量简单(可借助其他集合!!)

List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("2");
       	List<String> li=new ArrayList(new HashSet(list));
		for (String s : li){
            System.out.println(s);
        }

2019年1月份的世界编程语言排行榜从高到低依次如下: Java、C、Python、C++、Visual Basic .NET、JavaScript… 请将以上语言名称作为字符串元素,按顺序存入set集合中,并遍历查看。要求存储和遍历的顺序保持一致。

 LinkedHashSet<String> ha = new LinkedHashSet<>();
        ha.add("Java");
        ha.add("C");
        ha.add("Python");
        ha.add("Visual");
        ha.add("Basic");
        ha.add(".NET");
        ha.add("JavaScript");

        for (String s : ha){
            System.out.println(s);
        }

在某次考试中,学生的成绩信息如下(公有属性): 姓名(String) 年龄(int) 成绩(int): Tom 20 90; Jerry 22 95; John 20 100; Lily 22 100 ;Lucy 22 90; Kevin 22 90 请分别用Comparable和Comparator两个接口对以上同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序,成绩和年龄都一样,则按照姓名的字典顺序排序。

public class Student implements Comparable<Student> {
    private String name;
    private int age;
    private int score;//成绩

    public Student() {
    }

    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    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 int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public int compareTo(Student s) {
   		//返回值是负数:降序:大到小
   		//正数:升序
        int num = s.score - this.score;
        //年龄由小到大排序
        int num1 = num == 0 ? this.age - s.age : num;
        //按照姓名的字典顺序排序
        return num1 == 0 ? this.name.compareTo(s.name) : num1;
    }
}

测试类

TreeSet<Student> ha = new TreeSet<>();
        Student b1 = new Student("Tom", 20, 90);
        Student b2 = new Student("Jerry", 22, 95);
        Student b3 = new Student("John", 20, 100);
        Student b4 = new Student("Lily", 22, 100);
        Student b5 = new Student("Lucy", 22, 90);
        Student b6 = new Student("Kevin", 22, 90);

        ha.add(b1);
        ha.add(b2);
        ha.add(b3);
        ha.add(b4);
        ha.add(b5);
        ha.add(b6);

        for (Student b : ha) {
            System.out.println(b.getName()+"\t"+b.getAge()+"\t"+b.getScore());
        }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值