美文网首页
java学习第十九章 集合之Set

java学习第十九章 集合之Set

作者: 锋叔 | 来源:发表于2019-06-11 20:20 被阅读0次

Set是一个接口

  • 无序
  • 不重复
  • 实现类有HashSet TreeSet
HashSet
Set hs = new HashSet();
hs.add("1");
hs.add("2");
hs.add("abc");
hs.add("ab");
hs.add(123);
hs.add('a');
for(Object val : hs) {
    System.out.print(val + ",");
}
==> 打印结果:1,ab,a,2,abc,123,
  • remove() 删除方法
hs.remove("abc");
System.out.println("\n==========删除后=============");
for(Object val : hs) {
    System.out.print(val + ",");
}
==> 打印结果:1,ab,a,2,123,
  • remove() + add() 模拟修改
hs.remove('a');
hs.add('b');
System.out.println("\n==========模拟修改后=============");
for(Object val : hs) {
    System.out.print(val + ",");
}
==> 打印结果:1,ab,2,b,123,
  • contains() 查询方法
System.out.println("\n==========查询=============");
boolean flag = hs.contains('b');
System.out.println("是否包含b: " + flag);
==> 打印结果:是否包含b: true
泛型
  • 所谓的泛型就是在集合中指定存放的具体数据类型
    Set<String> hs1 = new HashSet<String>();
    这样就只能存储字符串String类型
    Set<Integer> hs2 = new HashSet<Integer>();
    这样就只能存数字Integer类型
存储高级数据无法去重
  • Person类,Student类
Set hs3 = new HashSet();
        
Student s1 = new Student("s1", "101", 10);
Student s2 = new Student("s1", "101", 10);
Student s3 = new Student("s2", "102", 30);

hs3.add(s1);
hs3.add(s2);
hs3.add(s3);

for (Object a : hs3) {
    System.out.println(a);
}

==> 打印结果
* Student [name=s1, className=101, score=10.0]
* Student [name=s2, className=102, score=30.0]
* Student [name=s1, className=101, score=10.0]
  • 解决方法
    我们需要在自定义类中左键生成hashcode() and equals() 方法。


    image.png
  • Student.java

public class Student {
    String name;
    String className;
    float score;
    public Student(String name, String className, float score) {
        super();
        this.name = name;
        this.className = className;
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", className=" + className + ", score=" + score + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((className == null) ? 0 : className.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + Float.floatToIntBits(score);
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (className == null) {
            if (other.className != null)
                return false;
        } else if (!className.equals(other.className))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (Float.floatToIntBits(score) != Float.floatToIntBits(other.score))
            return false;
        return true;
    }
    
}
TreeSet
  • 无序 (如果全是字母按照abcd排序,如果全是数字按照数字大小排序)
  • 只能存贮可以相互比较大小的数据。
字母
Set ts1 = new TreeSet();

ts1.add("5");
ts1.add("99");
ts1.add("-1");
ts1.add("0.77");
ts1.add("0");

for(Object a : ts1) {
    System.out.print(a  + ",");
}
  • 打印结果 : a,aa,bb,bbb,c,
数字
Set ts2 = new TreeSet();

ts2.add(5);
ts2.add(99);
ts2.add(-1);
ts2.add(77);
ts2.add(0); 

for(Object b : ts2) {
    System.out.print(b + ",");
}
  • 打印结果 : -1,0,5,77,99,
自定义类 Person
class Person {
    String name;
    int age;
    /**
     * @param name
     * @param age
     */
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

TreeSet 添加自定义类

Person p1 = new Person("疯子", 18);
Person p2 = new Person("傻子", 98);

Set ts3 = new TreeSet();
ts3.add(p1);
ts3.add(p2);
        
for(Object person  :  ts3) {
    System.out.println(person);
}   
  • 执行结果:报错 => Exception in thread "main" java.lang.ClassCastException: javaDemo3.Person cannot be cast to java.lang.Comparable
    why? 因为他们是无法比较大小的数据。
TreeSet添加对象使用Comparable接口
class PersonSet implements Comparable {
    String name;
    int age;
    /**
     * @param name
     * @param age
     */
    public PersonSet(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "PersonSet [name=" + name + ", age=" + age + "]";
    }
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        return 0;
    }
}
  • compareTo 是重点
PersonSet p1 = new PersonSet("疯子", 18);
PersonSet p2 = new PersonSet("傻子", 98);

Set ts3 = new TreeSet();
ts3.add(p1);
ts3.add(p2);
        
for(Object person  :  ts3) {
    System.out.println(person);
}
  • 执行上面的代码打印: PersonSet [name=疯子, age=18]
  • 只打印了一条,如何能存储多个对象呢?
修改 PersonSet 的 compareTo 方法,手动进行比较。
class PersonSet implements Comparable {
    String name;
    int age;
    /**
     * @param name
     * @param age
     */
    public PersonSet(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    /**
     * @return the age
     */
    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "PersonSet [name=" + name + ", age=" + age + "]";
    }
    
    @Override
    public int compareTo(Object o) {
        // Object o 等于第二个对象
        PersonSet person2 = (PersonSet) o;
        int age1 = this.getAge(); // 第一个对象的age
        int age2 = person2.getAge(); // 第二个对象的age
        // 对比大小
        if (age1 > age2) {
            return 1;
        } else if (age1 == age2) {
            return 0;
        } else {
            return -1;
        }
    }
}
  • 继续执行上面的代码打印结果:
    PersonSet [name=疯子, age=18]
    PersonSet [name=傻子, age=98]

相关文章

  • java学习第十九章 集合之Set

    Set是一个接口无序不重复实现类有HashSet TreeSet HashSet remove() 删除方法 re...

  • 聊聊Java中的Set -《Java语言程序设计进阶篇》读书笔

    Set是java集合框架中集合的一种。 java集合包括List,Set还有Queue。我们今天的主角就是Set。...

  • Java集合--Set(基础)

    1.Set 上一篇,我们介绍Java中的List集合。本篇,让我们继续学习,来了解下Set集合; Set继承于Co...

  • Java中的Set总结

    1.Set 上一篇,我们介绍Java中的List集合。本篇,让我们继续学习,来了解下Set集合; Set继承于Co...

  • 集合(二)~Set

    一、Set集合概述和特点 1. Set集合概述和特点 java.util.Set 接口和 java.util.Li...

  • Java集合之Set

    Java集合之Set 关系图如下 虚线为接口继承 实线为类继承 Set实现类之一HashSet类 数组结构,底层实...

  • Python ☞ day 4

    Python学习笔记之 (set)集合 & 迭代器 & 函数 & 匿名函数 & 高阶函数 set set:类似di...

  • Java集合类初探

    参考原文 一 java集合类简介 1、java集合大致可以分为Set、List、Queue、Map四类。 Set:...

  • java常用方法

    java集合的方法:①Set set = new HashSet<>();②set.cont...

  • java常用方法

    java集合的方法:①Set set = new HashSet<>();②set.cont...

网友评论

      本文标题:java学习第十九章 集合之Set

      本文链接:https://www.haomeiwen.com/subject/mligoqtx.html