Java集合-Set接口

Set接口的特点:无序,不允许重复(值唯一)

Set接口的三个实现类:①HashSet类②LinkedHashSet类③TreeSet类。

1.HashSet类

存储结构:使用HashMap进行存储

特点:无序、唯一

遍历方式:基于“迭代器”方式遍历Set  或者  使用迭代器方式的语法简化:语法糖

public static void main(String[] args) {
		HashSet set = new HashSet();
		
		set.addAll(Arrays.asList("1.小乔","2.大乔","3.曹操","4.许诸","5.张辽","6.赵云","7.典韦","8.夏侯惇"));
		Iterator it = set.iterator();
		//基于“迭代器”方式遍历Set
		//迭代器:遍历对应的集合
//		while(it.hasNext()) {
//			String item = it.next();
//			System.out.println(item);
//		}
		
		//迭代器方式的语法简化:语法糖
		for(String name:set) {
			System.out.println(name);
		}
	
	
	}

输出: 

1.小乔
7.典韦
5.张辽
4.许诸
8.夏侯惇
2.大乔
3.曹操
6.赵云

2.LinkedHashSet类

存储结构:使用LinkedHashMap进行存储

特点:有序(原因:LinkedHashMap在原有基础上,多维护了一条链表,用于保存,所以元素有序)、值唯一

public static void main(String[] args) {
		//无序
		HashSet set1 = new HashSet();
		set1.addAll(Arrays.asList("1.小乔", "2.大乔", "3.曹操", "4.许诸", "5.张辽", "6.赵云", "7.典韦", "8.夏侯惇"));
		
		//有序:Hash的子类,在原有基础上,多维护了一条链表,用于保存
		LinkedHashSet set2 = new LinkedHashSet();
		set2.addAll(Arrays.asList("1.小乔", "2.大乔", "3.曹操", "4.许诸", "5.张辽", "6.赵云", "7.典韦", "8.夏侯惇"));
	
		System.out.println(set1);
		System.out.println(set2);
		
	}

 输出:

[1.小乔, 7.典韦, 5.张辽, 4.许诸, 8.夏侯惇, 2.大乔, 3.曹操, 6.赵云]
[1.小乔, 2.大乔, 3.曹操, 4.许诸, 5.张辽, 6.赵云, 7.典韦, 8.夏侯惇]

应用例:过滤字符串中的重复字符

public static void main(String[] args) {
		
		String s = "莺莺燕燕袅袅花花唧唧复唧唧";
		
		//过滤重复字符
		LinkedHashSet set = new LinkedHashSet();
		for(int i = 0;i

 输出:

重复字符:莺
重复字符:燕
重复字符:袅
重复字符:花
重复字符:唧
重复字符:唧
重复字符:唧
[莺, 燕, 袅, 花, 唧, 复]

3.TreeSet类

存储结构:使用TreeMap进行存储

特点:自动排序、唯一。

排序:Comparable接口(默认比较规则)

           Comparable接口(自定义比较规则)

例(排序):

用TreeSet类自动排序

public static void main(String[] args) {
		//一个包含重复字符串的数组
		String[] ans = {"ABC","AB","ABCD","A","DEF","BCD","AC","BCD","ABCDE","B","AD","A","BCD","ABCD"};
		
		//需求1:过滤重复字符串.
		//需求2:自动排序(先按长度,长度如果一致,再按照内容)
		
		//构造方法,允许传入一个Comparator接口的比较器
		
		TreeSet set = new TreeSet();
		
		for(String s:ans) {
			set.add(s);
//			System.out.println(s);//遍历原字符串
		}
		for(String s:set) {
			System.out.println(s);//遍历排序后的字符串
		}
		
	}

自动排序后的结果输出:

A
AB
ABC
ABCD
ABCDE
AC
AD
B
BCD
DEF

先按长度,长度如果一致,再按照内容,需要用TreeSet的有参构造方法:

public static void main(String[] args) {
		//一个包含重复字符串的数组
		String[] ans = {"ABC","AB","ABCD","A","DEF","BCD","AC","BCD","ABCDE","B","AD","A","BCD","ABCD"};
		
		//需求1:过滤重复字符串
		//需求2:自动排序(先按长度,长度如果一致,再按照内容)
		
		//构造方法,允许传入一个Comparator接口的比较器
		TreeSet set = new TreeSet(new Comparator() {

			@Override
			public int compare(String o1, String o2) {
				if(o1.length()!=o2.length()) {
					//按照长度比
					return o1.length()-o2.length();
				}else {
					//按照内容比
					return o1.compareTo(o2);
				}
			}
			
		});
		
//		TreeSet set = new TreeSet();
//		
		for(String s:ans) {
			set.add(s);
//			System.out.println(s);//遍历原字符串
		}
		for(String s:set) {
			System.out.println(s);//遍历排序后的字符串
		}
		
	}

然后就会按着我们想要的结果输出了:

A
B
AB
AC
AD
ABC
BCD
DEF
ABCD
ABCDE

你可能感兴趣的:(java,开发语言)