Set集合
特点:无序(没有下标) 不重复
HashSet: 去重的功能
TreeSet: 排序的功能
HashSet
HashSet去重
private static void fun1() {
//创建一个HashSet
//保存ff aa bb dd
HashSet<String> set=new HashSet<>();
set.add("f");
set.add("f");
set.add("a");
set.add("a");
set.add("b");
set.add("b");
set.add("d");
set.add("d");
//有序:怎么存进去 打印出来就顺序
/*迭代器遍历(遍历方法一)
Iterator<String> iterator=set.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
System.out.println(next);
}*/
//增强for循环(遍历方法二)
for(String s:set) {
System.out.println(s);
}
}最后打印出a b d f
实现HashSet去重的功能
重写HashCode
只要创建对象,就给每一个对象分配一个HashCode码,当添加到set中的对象hashCode不相同的时,没有调用equals方法,并且对象直接存到Set集合中;当HashCode码相同的时候,会调用equals方法,来查看是否是同一个对象,是,就不存进去,反之。
TreeSet
是用来排序的
private static void fun1() {
//创建一个TreeSet 添加几个数 查看效果
TreeSet<Integer> set=new TreeSet<>();
set.add(1);
set.add(1);
set.add(5);
set.add(3);
set.add(4);
set.add(2);
System.out.println(set);
}//打印出来为[1,2,3,4,5]
TreeSet
存储规则
小的数 放到左边(返回负数的情况)
大的数 放到右边(返回正数的情况)
返回的是0 就不存储
输出规则
以升序输出(打印)
TreeSet在存储的时候
只跟compareTo方法的返回值有关
compareTo方法的返回值
返回0 只有一个元素
返回正数 打印数据 正序输出
返回负数 打印数据 倒序输出
TreeSet排序步骤
1.实现Comparable接口
public class Person implements Comparable<Person>{}
2.重写接口中的compareTo()方法
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
return 0;
}
3.编写你想要的排序规则
@Override
public int compareTo(Person o) {
int num=this.age-o.getAge();
return (num==0)?this.name.compareTo(o.getName()):num;
}
创建比较器来进行排序
class StringLengthImpl implements Comparator<String>{
//实现比较方法
@Override
public int compare(String o1, String o2) {
int length=o1.length()-o2.length();
//主要按长度 次要按字符串比较
int num=o1.compareTo(o2);
int rel=length==0?num:length;
return rel==0?1:rel;
}
}
private static void fun3() {
//集合中保存字符串 按字符串长度排序
//使用比较器来进行排序
//在比较器中 写你的排序规则
//利用TreeSet的构造方法
//直接将比较器的实现类传进去
TreeSet<String> set=new TreeSet<>(new StringLengthImpl());
set.add("
qwertyui");
set.add("qwertyui");
set.add("asd");
set.add("fghjk");
set.add("zxcvbnmasdfg");
System.out.println(set);
}
例题:键盘接收一个字符串,程序对其中所有字符进行排序,要求保留重复的。
class CharLengthImpl implements Comparator<Character>{
@Override
public int compare(Character o1, Character o2) {
int num=o1.compareTo(o2);
//保留重复的
return num==0?1:num;
}
}
private static void fun5() {
//键盘接收一个字符串, 程序对其中所有字符进行排序 要求保留重复的
System.out.println("请输入一个字符串");
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();
//字符串转字符数组
char[] charArray = string.toCharArray();
TreeSet<Character> set=new TreeSet<>(new CharLengthImpl());
//把字符数组中的字符添加到set中
for (int i = 0; i < charArray.length; i++) {
set.add(charArray[i]);
}
System.out.println(set);
}
例题: 程序启动后,可以从键盘输入接收多个整数,直到输入quit时结束输入,把所有输入的整数倒序排列打印。
class NumberCompare implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
//倒序
int num=o2-o1;
return num==0?1:num;
}
}
private static void fun6() {
// 程序启动后, 可以从键盘输入接收多个整数,
// 直到输入quit时结束输入.
// 把所有输入的整数倒序排列打印.
System.out.println("输入整数 quit时结束");
Scanner scanner =new Scanner(System.in);
//创建排序的set
TreeSet<Integer> set=new TreeSet<>(new NumberCompare());
while (true) {
//判断用户输入
String string=scanner.nextLine();
//判断是不是quit
if (string.equals("quit")) {
break;
}
//转化成数字
int num=Integer.parseInt(string);
//保存到set中 排序
set.add(num);
}
System.out.println(set);
}