首页 » 技术分享 » Set集合 去重和比较方法

Set集合 去重和比较方法

 

Set集合

特点: 无序(没有下标)  集合中的元素不重复

HashSet

hashset具有去重功能

例:  创建一个hashset 保存 f f a a b b d d  

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");
// 增强for循环
for (String string : set) {
	System.out.println(string);
}

打印结果 a b d f 

去重且无序(不是按照输出顺序打印)

注意: 打印对象不会自动去重 需要重写equals和hashcode方法

        去重系统类的对象时不用重写

 去重: 当添加到Set的对象 HashCode码不相同时 不会调用equals方法,对象直接存到Set集合中       

         hashset相同时 才会调用equals方法 查看是否是同一个对象(是否重复)  是---则无法存入

public static void main(String[] args) {
HashSet<Person1> hashSet = new HashSet<>();
hashSet.add(new Person1("吕布", 25));
hashSet.add(new Person1("吕布", 25));
hashSet.add(new Person1("关羽", 26));
hashSet.add(new Person1("关羽", 26));
hashSet.add(new Person1("赵云", 23));
hashSet.add(new Person1("赵云", 23));
for (Person1 person1 : hashSet) {
	System.out.println(person1);
    }
}

LinkedHashSet  有序的HashSet(按照存入集合的顺序打印)

// 去重系统类的对象时候 不用重写equals hashset方法了
public class D1fun4 {
	public static void main(String[] args) {
		HashSet<Integer> set = new HashSet<>();
		while (set.size() < 10) {
			int num = (int)(Math.random()*(20-1+1)+1);
			set.add(num); // 自动装箱
		}
		for (Integer integer : set) {
			System.out.print(integer + " ");
		}
	}

例: 

利用set集合 

去除ArrayList集合中的重复元素(操作原ArrayList)

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("a");
    list.add("a");
    list.add("b");
    list.add("b");
    list.add("c");
    list.add("c");
    list.add("d");
    list.add("d");
    HashSet<String> set = new HashSet<>();
    set.addAll(list);
    System.out.println(set);
    list.clear();  // 清空原有元素 放入被list去重后的元素
    list.addAll(set);
    System.out.println(list);
}
TreeSet

TreeSet用来排序

创建一个TreeSet 添加几个数 查看效果

TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(66);
treeSet.add(66);
treeSet.add(22);
treeSet.add(77);
treeSet.add(11);
treeSet.add(11);
System.out.println(treeSet);

输出结果自动去重排序

TreeSet 存入对象

public static void main(String[] args) {
	TreeSet<Person1> set = new TreeSet<>();
	set.add(new Person1("张三", 24));
	set.add(new Person1("王五", 26));
	set.add(new Person1("刘六", 26));
	set.add(new Person1("李四", 23));
	set.add(new Person1("赵四", 20));
	System.out.println(set);
}

打印结果异常

注意:  TreeSet存入对象 打印时 需要实现Comparable接口 或者 创建比较器

写TreeSet排序规则步骤:

1.实现Comparable接口

// 实现Comparable接口
public class Person implements Comparable<Person>{

}

2.重写接口中的 comparableTo() 方法

3.编写你想要的排序规则

@Override
public int compareTo(Person o) {
    int num = this.age - o.getAge();
    return (num==0) ? this.name.compareTo(o.getName()):
    this.age - o.getAge();
}

输出规则: 以升序输出

compareTo返回值:

返回0  只有一个元素

返回正数  打印的数据 正序输出(不会去重 需要写compareTo方法)

返回负数  打印的数据 倒序输出

public static void main(String[] args) {
	TreeSet<Person1> set = new TreeSet<>();
	set.add(new Person1("张三", 24));
	set.add(new Person1("张三", 24));
	set.add(new Person1("王五", 26));
	set.add(new Person1("刘六", 26));
	set.add(new Person1("李四", 23));
	set.add(new Person1("赵四", 20));
	System.out.println(set);
}

此时打印报错 需
实现
Comparable接口 或者 创建比较器

// 实现Comparable接口
public class Person implements Comparable<Person>{

}

按需求重写规则

// 重写比较规则
@Override
public int compareTo(Person1 o) {
	int num = this.age - o.getAge();
	return num == 0 ? 1 : num;
}

例:

集合中保存字符串 按字符串长度排序

使用比较器 来进行排序

在比较器中写需求的排序规则

利用TreeSet的构造方法

直接将比较器的实现类传进去

在类的外部创建比较器

// 创建比较器
class StringLength implements Comparator<String> {
	// 实现比较方法 重写比较规则
	@Override
	public int compare(String o1, String o2) {
		// 主要按长度 长度一样比较字符
		int num = o1.length() - o2.length();
		int c = o1.compareTo(o2); 
		return num == 0 ? c : num;
	}	
}
public class D2fun3 {
	public static void main(String[] args) {
            TreeSet<String> set = new TreeSet<>(new StringLength());
	    set.add("linaiang");
	    set.add("hailong");
	    set.add("liucong");
	    set.add("liyuechen");
	    set.add("wangxiaotie");
	    for (String string : set) {
		System.out.println(string);
	    }
	}
}

例:

程序启动后, 可以从键盘输入接收多个整数,

直到输入quit时结束输入. 

把所有输入的整数倒序排列打印

public class D2fun6 {
	public static void main(String[] args) {
		System.out.println("请输入整数 输入quit结束");
		Scanner scanner = new Scanner(System.in);
		TreeSet<Integer> set = new TreeSet<>(new IntPrint());
		
		while (true) {
			String string = scanner.nextLine();
			if (string.equals("quit")) {
				break;
			}
			int num = Integer.parseInt(string);
			set.add(num);
		}
		System.out.println(set);
	}
}
// 创建比较器
class IntPrint implements Comparator<Integer> {

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

转载自原文链接, 如需删除请联系管理员。

原文链接:Set集合 去重和比较方法,转载请注明来源!

0