Java序谈之HashSet类和TreeSet类

来源:互联网 发布:office2016激活工具mac 编辑:程序博客网 时间:2024/05/21 06:28

Set接口的特点?

1、无角标

2、不按顺序排列

3、元素不重复

Set接口分类?

HashSet类和TreeSet类

HashSet的作用、使用方式,存储特点?

作用:去除集合中重复元素

使用方式:在集合中元素所在集合中重写HashCode()方法、重写equals()方法

存储特点:每个集合中的元素会被分配一个哈希值,这个哈希值是元素特有的值,并且判断是否有相同的哈希值,如果存在进入equals方法

进行判断,是否是相同的元素,返回值类型是Boolean类型的

LinkedHashSet

可以在去除重复元素的同时,按照元素装填的顺序输出元素

需求:去除一些重复的对象

代码示例:

LinkedHashSet<Person> hashSet = new LinkedHashSet<>();hashSet.add(new Person(18,"wang"));hashSet.add(new Person(17,"wang"));hashSet.add(new Person(19,"wangnn"));hashSet.add(new Person(20,"wangning"));hashSet.add(new Person(18,"wang"));System.out.println(hashSet);

HashCode()和equals()方法

代码示例:

@Overridepublic int hashCode() {// TODO Auto-generated method stubreturn this.age;}@Overridepublic boolean equals(Object obj) {Person p1 = (Person)obj;return  this.age==p1.age&&this.name.equals(p1.getName());}

需求:存入十个随机数(1~20),去掉重复

代码示例:

HashSet<Integer> hashSet2 = new HashSet<>();while (hashSet2.size()<10) {int a = (int)(Math.random()*20)+1;hashSet2.add(a);}System.out.println(hashSet2);

Integer类中重写了HashCode()和equals()方法,这里不需要自己判断

需求:输入一个字符串,去掉重复的字符,打印出不同的字符

Scanner scanner = new Scanner(System.in);System.out.println("请输入一个字符:");String str = scanner.nextLine();char[] charArray = str.toCharArray();HashSet<Character> hashSet3 = new HashSet<>();for (int i = 0; i < charArray.length; i++) {hashSet3.add(charArray[i]);}System.out.println(hashSet3);
String类中重写了HashCode()和equals()方法,这里不需要自己判断

需求:操作原集合,使用ArrayList集合,完成去重的操作

代码示例:

 ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("b");HashSet<String> hashSet4 = new HashSet<>();hashSet4.addAll(arrayList);arrayList.clear();arrayList.addAll(hashSet4);System.out.println(arrayList);

TreeSet类的作用、使用方式、存储特点?

作用:可以对集合进行排序

使用方式:建立一个类实现comparator接口,重写其中的compare方法,返回值类型是int型,并且在TreeSet初始化时候传入这个对象

存储特点:按照二叉树存储,当返回值大于0,存储在右边,当返回值小于0,存储在左边,当返回值=0,舍弃,一般也允许重复情况

需求:创建一个TreeSet添加几个数,查看效果,可以对整数排序

代码示例:

TreeSet<Integer> treeSet = new TreeSet<>();treeSet.add(2);treeSet.add(2);treeSet.add(1);treeSet.add(3);treeSet.add(5);treeSet.add(4);treeSet.add(6);System.out.println(treeSet);

分析:integer类中已经实现了comparator接口,重写了compare方法

需求:将字符按照顺序排序

代码示例:

TreeSet<String> treeSet = new TreeSet<>(new Comparator1());treeSet.add("aaa");treeSet.add("bbb");treeSet.add("ccc");treeSet.add("ss");System.out.println(treeSet);

比较器部分代码示例:
public int compare(String o1, String o2) {int length = o1.length() - o2.length();int num = length ==0 ? o1.compareTo(o2) : length;return num == 0 ? -1 : num;}

分析:num返回0时候设置为-1,这样就保存了重复元素

需求:输入字符串,倒序打印

代码分析:

TreeSet<Character> treeSet2 = new TreeSet<>(new Comparator2());String str1 = scanner.nextLine();char[] charArray2 = str1.toCharArray();for (int i = 0; i < charArray2.length; i++) {treeSet2.add(charArray2[i]);}
比较器部分代码示例:
@Overridepublic int compare(Character o1, Character o2) {int num = o2 - o1;return num == 0 ? 1 : num;}

需求:在一个ArrayList集合中存储了无序并且重复的字符串,要求排序,而且还不能去除重复

代码示例:

public static void fun4() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("wangning");arrayList.add("wangning");arrayList.add("wang");arrayList.add("ning");arrayList.add("wangn");TreeSet<String> treeSet = new TreeSet<>(new Comparator2());treeSet.addAll(arrayList);arrayList.clear();arrayList.addAll(treeSet);System.out.println(arrayList);}

比较器部分代码示例:

@Overridepublic int compare(String o1, String o2) {// TODO Auto-generated method stubint length = o1.length() - o2.length();int num = length ==0 ? o1.compareTo(o2) : length;return num == 0?-1 :num ;

需求:接收一些整数,并且将这些数全部倒序打印出来

代码示例:

HashSet<Integer> hashSet5 = new HashSet<>();while (hashSet5.size()<5) {String a1 = scanner.nextLine();if(a1.equals("quit")) {break;}hashSet5.add(Integer.parseInt(a1));}System.out.println(hashSet5);

比较器部分代码示例:

@Overridepublic int compare(Integer o1, Integer o2) { int num = o1 - o2;return num == 0 ? o1 : num;}

需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台

代码示例:

public static void fun7() {Scanner scanner = new Scanner(System.in);TreeSet<Student> treeSet = new TreeSet<>(new Comparator5());for (int i = 0; i < 5; i++) {Student s1 = new Student();System.out.println("请输入信息");String name = scanner.nextLine();String [] array = new String[4];array = name.split(",");s1.setName(array[0]);s1.setChinese(Integer.parseInt(array[1]));s1.setMath(Integer.parseInt(array[2]));s1.setEnglish(Integer.parseInt(array[3]));s1.setTotal(s1.getChinese()+s1.getEnglish()+s1.getMath());treeSet.add(s1);}System.out.println(treeSet);scanner.close();}
比较器部分代码示例:
@Overridepublic int compare(Student o1, Student o2) {// TODO Auto-generated method stubint num = o1.getTotal() - o2.getTotal();return num == 0 ? -1 : num;}

分析:这里需要建立一个Student类,分别对应五个属性,使用TreeSet类根据总成绩进行正向排序。

原创粉丝点击