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