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()方法
代码示例:
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.age;
}
@Override
public 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]);
}
比较器部分代码示例:
@Override
public 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);
}
比较器部分代码示例:
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
int 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);
比较器部分代码示例:
@Override
public 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();
}
比较器部分代码示例:
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
int num = o1.getTotal() - o2.getTotal();
return num == 0 ? -1 : num;
}
分析:这里需要建立一个Student类,分别对应五个属性,使用TreeSet类根据总成绩进行正向排序。