Set集合
特点:无序(没有下标) 不重复
HashSet: 去重的功能
TreeSet: 排序的功能
HashSet
HashSet去重
private static void fun1() { //创建一个HashSet //保存ff aa bb dd HashSet 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 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 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{}
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{ //实现比较方法 @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 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{ @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 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{
@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 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); }