Java Set集合如何保证元素不重复 java中的set集合

94 阅读3分钟

 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); }