Java进阶之路~Set集合

Set:无序(没有下标) 不重复的集合
一 HashSet
核心:去重
public static void fun1() {
	//创建一个HashSet
	//保存 f f aa bb dd
	HashSet hashSet = new HashSet<>();
	hashSet.add("f");
	hashSet.add("f");
	hashSet.add("a");
	hashSet.add("a");
	hashSet.add("b");
	hashSet.add("b");
	hashSet.add("d");
	hashSet.add("d");
	//有序: 怎么存进去 打印出来就什么顺序
	//迭代器遍历
	for (String string : hashSet) {
		System.out.println(string);
	}
}

public static void fun2() {
	//创建Set集合 保存6个人 两重复
	HashSet hashSet = new HashSet<>();
	hashSet.add(new Person("奥特曼",12));
	hashSet.add(new Person("奥特曼",12));
	hashSet.add(new Person("假面骑士",14));
	hashSet.add(new Person("假面骑士",14));
	hashSet.add(new Person("发送快递",12));
	hashSet.add(new Person("发送快递",12));
	for (Person person : hashSet) {
		System.out.println(person);
	}
}

而如若想打印的顺序为存储的顺序,需要具有有序的性质,此时使用LinkedHashSet

public static void fun3() {
	//Linked 表示 有序
	//怎么存的,打印出来,还是原来的顺序
	LinkedHashSet set = new LinkedHashSet<>();
	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 (String string : set) {
		System.out.println(string);
	}
}

根据HashSet性质,编写几个案例

1.编写一个程序,获取10个1至20的随机数,要求随机数不能重复

public static void fun4() {
	//编写一个程序,获取10个1至20的随机数,要求随机数不能重复
	//创建一个set ,循环生成10个随机数添加到Set中,去重
	//去重系统类的对象,不用重写那两个方法
	HashSet< Integer> set = new HashSet<>();
	
	a:while(set.size() < 10) {
//		for(int i = 0; i < 10 - set.size(); i++) {
			int rd = (int)(Math.random()*20 + 1);
			set.add(rd);//自动装箱
//			if (set.size() == 10) {
//				break a;
//			}
//		}
	}
	System.out.println(set.size());//10
	System.out.println(set);//10个不同随机数组
}

2.利用set集合,去除ArrayList集合中的重复元素(操作原ArrayList , ArrayList保存aabbccdd)

public static void main(String[] args) {		
	HashSet set = new HashSet<>();
	ArrayList 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");
	set.addAll(list);
	//清空list集合
	list.clear();
	//所有元素 放回list中
	list.addAll(set);		
}

二 TreeSet
核心:排序

排序步骤:

1.实现Comparable接口

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

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

public static void fun1() {
	//创建一个TreeSet 添加几个数 查看效果
	TreeSet set = new TreeSet<>();
	set.add(1);
	set.add(4);
	set.add(5);
	set.add(2);
	set.add(3);
	set.add(3);
	set.add(3);
	set.add(8);		
	set.add(6);
	set.add(7);
	System.out.println(set);
}

莫忘了Set集合是无序不重复的,因此打印出来的是


根据TreeSet排序的特点,写几个经典案例

public static void fun2() {
	//创建一个TreeSet 添加4个人 查看效果
	//按年龄排序
	TreeSet set = new TreeSet<>();
	set.add(new Person("大海",18));
	set.add(new Person("恐龙",28));
	set.add(new Person("地狱",28));
	set.add(new Person("地狱",22));
	System.out.println(set);
}

只打印出一个

因为,在Person中重写的compareTo方法,返回的默认值是0

public int compareTo(Person o) {
	// TODO Auto-generated method stub
	return 0;
}

在实现comparable接口中的方法时:

返回0 不存储元素 只有一个元素

返回正数 打印数据 正序输出

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

注意:TreeSet在存储的时候,只跟compareTo方法的返回值有关

@Override
public int compareTo(Person o) {
	//按年龄排序
//	return	this.age - o.getAge();
	//按姓名排序
//	return this.name.compareTo(o.getName());
	//主要按年龄排序 次要按姓名排
	int num = this.age - o.getAge();
	//
	return (num == 0) ? this.name.compareTo(o.getName()) : num; 
}

1.在一个集合ArrayList中存储了无序并且重复的字符串

要求:排序,而且不能去除重复(用比较器) 主要按字符串长度比较,次要按字符比

public static void fun4() {
	ArrayList list = new ArrayList<>();
	list.add("dahai");
	list.add("pengqian");
        list.add("fanpeng");
	list.add("dahai");
	list.add("liuzhih");
	list.add("zhangjianhai");
	list.add("tianrui");
	TreeSet set = new TreeSet<>(new StringLengthImpl());
	set.addAll(list);
	list.clear();
	list.addAll(set);
	System.out.println(list);
}

创建比较器

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

2.键盘接收一个字符串,程序对其中所有字符进行排序

public 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 CharImpl());
	for (int i = 0; i < charArray.length; i++) {
		set.add(charArray[i]);
	}
	System.out.println(set);
}
class CharImpl implements Comparator{
	@Override
	public int compare(Character o1, Character o2) {
		int num = o1.compareTo(o2);
		return num == 0? 1 : num;
	}
}

3.程序启动后,可以从键盘输入接收多个整数,直到输入quit时结束输入,把所有输入的整数倒序排列打印

public static void fun6() {
	//  程序启动后, 可以从键盘输入接收多个整数,
	//  直到输入quit时结束输入. 
	//  把所有输入的整数倒序排列打印.
	System.out.println("请输入一段整数 , quit时结束");
	Scanner scanner = new Scanner(System.in);
//	String string = scanner.nextLine();
//	char[] charArray = string.toCharArray();
//	TreeSet set = new TreeSet<>(new Integer1Impl());	
//	for (int i = 0; i < charArray.length; i++) {
//		set.add(charArray[i]);
//	}
//	System.out.println(set);
			
	//创建set
	TreeSet set = new TreeSet<>(new Integer2Impl());
	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);
	}
class Integer2Impl implements Comparator{
	@Override
	public int compare(Integer o1, Integer o2) {
		int num = o1 - o2 ;
		return num == 0? 1 : -num;
	}	
}


你可能感兴趣的:(Java进阶之路~Set集合)