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);
}
排序步骤:
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;
}
}