概述:不可以重复,存取顺序不一致,没有带索引的方法,不可以使用普通的for循环进行遍历,也不能通过索引来获取删除set集合中的元素
package com.ustc.test5; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class myset { public static void main(String[] args) { Setset = new TreeSet<>();//set 是一个接口不可以直接使用 set.add("a"); set.add("b"); set.add("c"); set.add("d"); set.add("e"); set.add("e"); Iterator it = set.iterator(); //迭代器 while(it.hasNext()) { System.out.println(it.next()); } } }
TreeSet基本使用:不包含重复元素,没有带索引方法,将内部元素进行排序
- 指定排序规则1
如果compareTo的返回值是负数:表示当前存入的元素是较小值 存入左边,正数,存入右边,0 说明存入的元素和集合中的元素重复了,舍去
需求分析:如果年龄一样,按照姓名首字母进行排序
如果姓名和年龄一样,才认为是同一个学生对象 不存入
package com.ustc.test5; import sun.reflect.generics.tree.Tree; import java.util.TreeSet; public class treeset { public static void main(String[] args) { TreeSetts = new TreeSet<>(); Student s1 = new Student("xxx",21); Student s2 = new Student("xxf",22); Student s3 = new Student("xvf",23); ts.add(s1); ts.add(s2); ts.add(s3); System.out.println(ts); } }
package com.ustc.test5; public class Student implements Comparable{ 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 + ''' + '}'; } @Override public int compareTo(Student o) { int result = this.age - o.age; //按照对象年龄进行排序 //这个compareTo 和上面的compareTo不一样, 按照字典顺序比较字符串 result = result == 0 ? this.name.compareTo(o.getName()):result;//按照姓名进行排序 return result; } }
- 指定排序规则2:
比较器排序:TreeSet的带参构造方法使用的是比较器排序对元素进行排序
让集合构造方法接受Comparator实现类对象,重写compare(To1,To2)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
package com.ustc.test5; import sun.reflect.generics.tree.Tree; import java.util.Comparator; import java.util.TreeSet; public class test11 { public static void main(String[] args) { TreeSetts = new TreeSet<>(new Comparator () { @Override public int compare(Teacher o1, Teacher o2) { //o1现在要存入的元素 o2表示已经存入的元素 int result = o1.getAge() - o2.getAge(); //主要条件 按照年龄来判断 //要存入的对象姓名与已经存入对象的姓名进行比较 返回result result = result == 0 ? o1.getName().compareTo(o2.getName()):result;//次要条件 return result; } }); Teacher t1 = new Teacher("zhangsan",23); Teacher t2 = new Teacher("lisi",22); Teacher t3 = new Teacher("wangwu",24); ts.add(t1); ts.add(t2); ts.add(t3); System.out.println(ts); } }
package com.ustc.test5; public class Teacher { private String name; private int age; public Teacher() { } public Teacher(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 "Teacher{" + "name='" + name + ''' + ", age=" + age + '}'; } }
两种方式比较:
自然排序:自定义实现接口Compareable 重写compareTo方法 根据返回值进行排序
比较器排序:创建treeSet对象的时候传递Comparator实现类对象,重写compare方法 根据返回值进行排序
需求:按照字符串的长度进行排序 如果长度一样长按照首字母进行排序
package com.ustc.test5; import sun.reflect.generics.tree.Tree; import java.util.Comparator; import java.util.TreeSet; public class test22 { public static void main(String[] args) { // TreeSetts = new TreeSet<>(new Comparator () { // @Override // public int compare(String o1, String o2) { // int result = o1.length() - o2.length(); // result = result == 0 ? o1.compareTo(o2):result; // return result; // } // }); //上述方法使用匿名内部类进行重写方法 //下面的方法使用lambda进行重写 TreeSet ts = new TreeSet<>( (String o1,String o2)->{int result = o1.length() - o2.length(); result = result == 0 ? o1.compareTo(o2):result; return result;} ); ts.add("c"); ts.add("ab"); ts.add("df"); ts.add("qwer"); System.out.println(ts); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)