Set(接口)

Set(接口)

1.set集合储存原理

1.当hashCod值相同时会调用equal方法 进行对比 是同一个对象就不储存
2.当hashCod值不同时 不调用equals方法直接储存了

2.set集合两大特性

2.1不重复
2.11集合去重
public class text {
public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
     list.add("a");
     list.add("a");
     list.add("d");
     list.add("d");
     list.add("c");
     list.add("c");
     list.add("a");
     LinkedHashSet<String> set = new LinkedHashSet<>();
     set.addAll(list);//将list所有元素任到Set中去重
     System.out.println(set);
     //清空
     list.clear();
     //再赋值给list
     list.addAll(set);
     System.out.println(list);
}
}

运行结果:
[a, d, c]
[a, d, c]
2.12字符串去重
public class text {
public static void main(String[] args) {
    System.out.println("请输入字符串:");
    Scanner scanner = new Scanner(System.in);
    String dString = scanner.next();
    LinkedHashSet<Character>linkedHashSet = new LinkedHashSet<>();
    char[] sObject = dString.toCharArray();
    for (int i = 0; i < sObject.length; i++) {
        linkedHashSet.add(sObject[i]);
    }
    System.out.println(linkedHashSet);
}
}
2.13对象类去重
public class text {
public static void main(String[] args) {
    //      通过重写对象类的equal和hasCode方法来去重
    HashSet<Person> set = new HashSet<>();
    set.add(new Person("泡泡",12));
    set.add(new Person("泡泡",12));
    set.add(new Person("哈哈",12));
    set.add(new Person("哈哈",12));
    set.add(new Person("飞飞",12));
//  //变历set集合 查看去重效果
//  Iterator<Person> iterator = set.iterator();
//  while (iterator.hasNext()) {
//      Person person = iterator.next();
//      System.out.println(person);
//  }
    for(Person person : set) {
        System.out.println(person);
    }
}
}
运行结果:
Person [name=飞飞, age=12]
Person [name=泡泡, age=12]
Person [name=哈哈, age=12]

2.2有序

2.2.1字符排序
public class text {
public static void main(String[] args) {
    //      使用hashset主要是用来去重
    //创建一个HashSet
    HashSet<String>set = new HashSet<>();
    //添加 dd 看看效果
    boolean add = set.add("s");
    boolean add2 = set.add("d");
    boolean add3 = set.add("a");
    boolean add4 = set.add("b");
    boolean add5 = set.add("c");
//      有序是怎么存的怎么打印出来
    System.out.println(add);
    System.out.println(add2);
    System.out.println(set);
}
}

运行结果:
true
true
[a, b, s, c, d]
2.2.2数字排序.
public class text {
public static void main(String[] args) {
    //      使用hashset主要是用来去重
    //创建一个HashSet
    HashSet<String>set = new HashSet<>();
    //添加 dd 看看效果
    boolean add = set.add("5");
    boolean add2 = set.add("2");
    boolean add3 = set.add("8");
    boolean add4 = set.add("6");
    boolean add5 = set.add("9");
//      有序是怎么存的怎么打印出来
    System.out.println(add);
    System.out.println(add2);
    System.out.println(set);
}
}

运行结果:
true
true
[2, 5, 6, 8, 9]

3.定义类

3.1Work类
public class Worker extends Person implements Comparable<Worker>{

    public Worker() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Worker(String name, int age) {
        super(name, age);
        // TODO Auto-generated constructor stub
    }
    //  实现接口中的唯一的一个方法
    /*
     * 返回0时 set中只有一个元素
     * 1(正数)    按存进去的顺序 正序打印
     * -1(负数)   按存进去的顺序 倒序打印
     * 
     * TreeSet  按二叉树保存的
     * 要保存的数比我大   放在我的右边  (返回负数)
     * 要保存的数比我小   放在我的左边  (返回正数)
     * 要保存的数一样大   不储存
     * 打印按从小到大输出(升序)
     * 
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    /*
    @Override
    public int compareTo(Worker o) {
        // 按年龄比较
        return this.getAge() - o.getAge();
    }
    */
    //  按姓名进行比较
    /*public int compareTo(Worker o) {
        // 按年龄比较
        return this.getName().compareTo(o.getName());
    }
    */
    //  比较的主要条件 按年龄
    //  次要条件       按姓名
    public int compareTo(Worker o) {
        // 按年龄比较
        /*
        if((this.getAge() - o.getAge()) != 0) {
             return this.getAge() - o.getAge();
        }else {
            return this.getName().compareTo(o.getName());
        }*/

        /*
         * 主要比字符串长度
         * 然后比年龄
         * 最后比较字符串
         */
        /*
        if(this.getName().length() != o.getName().length()) {
            return this.getName().length() - o.getName().length();
        }else if((this.getAge() - o.getAge()) != 0) {
             return this.getAge() - o.getAge();
        }else {
            return this.getName().compareTo(o.getName());
        }*/
        //  比较字符串长度
        int length = this.getName().length() - o.getName().length();
        //  长度一样比年龄
        int num= length == 0 ? this.getAge() - o.getAge():length;
        //  年龄也一样 比较字符串
        return num == 0 ? this.getName().compareTo(o.getName()) : num;

    }
}
3.2Student类
public class Student {
    private String name;
    private int grade1;
    private int grade2;
    private int grade3;
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(String name, int grade1, int grade2, int grade3) {
        super();
        this.name = name;
        this.grade1 = grade1;
        this.grade2 = grade2;
        this.grade3 = grade3;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getGrade1() {
        return grade1;
    }
    public void setGrade1(int grade1) {
        this.grade1 = grade1;
    }
    public int getGrade2() {
        return grade2;
    }
    public void setGrade2(int grade2) {
        this.grade2 = grade2;
    }
    public int getGrade3() {
        return grade3;
    }
    public void setGrade3(int grade3) {
        this.grade3 = grade3;
    }
    @Override
    public String toString() {
        return "[姓名=" + name + ", 数学成绩=" + grade1 + ", 语文成绩=" + grade2 + ", 英语成绩" + grade3 + "]";
    }

}
3.3Person类
public class Person {
    private String name;
    private int age;
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Person(String name, int age) {
        super();
        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 "[姓名=" + name + ", 年龄=" + age + "]";
    }
    //  之后使用系统自动生成的hashCode 和 equals
    /*@Override
    public int hashCode() {
        //  31是个质数  只能被1和本身整除  乘法减少公约数

        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) {
        if (this == obj)  //  如果两个对象地址一样  
            return true;  //  就返回true
        if (obj == null)  //  如果传进来的对象是空
            return false; //  就返回false
        if (getClass() != obj.getClass())  //  如果两个对象不是一个类创建出来
            return false; //  就返回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))  //使用字符串类的比较 判断字符串是否相同
            return false;
        return true;
    }
    */

    //  重写equals方法
    @Override
    public boolean equals(Object obj) {
        System.out.println("你猜猜 我执行了吗");
        // TODO Auto-generated method stub
        //  名字相同 和 年龄相同 就是同一个对象
        Person person = (Person)obj;
        return this.name.equals(person.getName()) && (this.age == person.getAge());
    }
    //  重写 hashCode方法
    //  Set集合在进行存储的时候
    //  当hashCode值相同
    //  会调用equals方法 进行对比   是同一个对象就不存
    //  当hashCode值不相同时 没有调用equals方法  直接就存了
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        final int num = 15;
        return this.name.hashCode() * num + this.age;
    }

}
3.4KeepStudent类
public class KeepStudent implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        // TODO Auto-generated method stub

        int num1= o1.getGrade1() + o1.getGrade2() + o1.getGrade3();
        int num2 = o2.getGrade1() + o2.getGrade2() + o2.getGrade3(); 
        int num = num1 - num2;
        if(num == 0) {
            return 1;
        }
        return num;
    }


}
3.5CharCompImpl类
public class CharCompImpl implements Comparator<Character>{

    @Override
    public int compare(Character o1, Character o2) {
        // TODO Auto-generated method stub
        int num = o1.compareTo(o2);
        if(num == 0) {
            return 1;
        }
        return num;
    }


}
3.6Compara类
public class Compara implements Comparator<Integer>{

    @Override
    public int compare(Integer o1, Integer o2) {
        // TODO Auto-generated method stub
        int num = o1 - o2;
        if(num == 0)
            return 1;
        return num;
    }

}

4.TreeSet(内部实现二叉树)

4.1使用TreeSet排序的步骤
1.让TreeSet集合中要保存的对象 实现Comparable接口
2.实现compareTo方法
3.在compareTo方法 实现 你要排序的规则
4.1创建一个TreeSet遍历
public class text {
public static void main(String[] args) {
    //  创建一个TreeSet
    TreeSet<Integer> set = new TreeSet<Integer>();
    set.add(1);
    set.add(11);
    set.add(1);
    set.add(2);
    set.add(3);
    System.out.println(set);
    //  遍历
    for(Integer integer : set) {
        System.out.println(integer);
    }
}
}

运行结果:
[1, 2, 3, 11]
1
2
3
11
          创建TreeSet集合 保存4个工人
          系统给你留了接口Comparable 如果你想通过TreeSet来排序
          你就实现这个接口 编写排序规则 系统就会按规则来排序

4.2按

public class text {
public static void main(String[] args) {
    TreeSet<Worker> set = new TreeSet<>();
    set.add(new Worker("张三",23));
    set.add(new Worker("王五",15));
    set.add(new Worker("李四",15));
    set.add(new Worker("赵六",16));
//  for(Worker worker : set) {
//      //
//      System.out.println(worker);
//  }
    System.out.println(set);
    //System.out.println((int) '张')
}
}
运行结果:
[Person [name=李四, age=15], Person [name=王五, age=15], Person [name=赵六, age=16], Person [name=张三, age=23]]
********************************************

    public int compareTo(Worker o) {
        int length = this.getName().length() - o.getName().length();
        int num = length == 0 ? this.getAge() - o.getAge() : length;
        return num == 0 ? this.getName().compareTo(o.getName()) : num;

    }
    /*
     * 使用比较器来排序
     * 1.创建一个类 实现 comparator类
     * 2.实现接口中的方法 并编写 比较的规则
     * 3.把该类的对象 传人 TreeSet集合中
     */
//  使用比较器来排序
    TreeSet<String>set = new TreeSet<>(new StringLengththCompareImpl());
    set.add("asd");
    set.add("asde");
    set.add("asdef");
    set.add("as");
//按字符串长度排序
    System.out.println(set);

运行结果:
[as, asd, asde, asdef]

class StringLengththCompareImpl implements Comparator<String>{

    @Override
    public int compare(String o1, String o2) {
        int num = o1.length() - o2.length();
        return num == 0? o1.compareTo(o2):num;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值