java——Set集合
来源:互联网 发布:5sing音乐软件 编辑:程序博客网 时间:2024/06/04 23:50
Set集合:无须 无下标 不重复
一、1.Set接口
Set接口是一个不包含重复元素的集合,由于其继承了Collection接口,所有包含了其全部方法。
2.Set接口的实现类
(1)HashSet :
HashSet是Set接口的一个实现类,它不允许重复元素。
HashSet主要依据哈希算法直接将元素指定到地址上。
当添加元素时要调用equls方法来判断是否有重复的元素。
判断是通过hashCode来进行比较的
ublic class Demo01 { public static void main(String[] args) { // fun1(); // fun2(); // fun3(); // fun4(); // fun5(); // fun6(); } private static void fun6() { // 利用set集合 去除ArrayList集合中的重复元素(操作原ArrayList) ArrayList<String> list = new ArrayList<>(); list.add("c"); list.add("c"); list.add("a"); list.add("a"); list.add("b"); list.add("b"); // 为了保持存进去的顺序 选用 linkedHashSet LinkedHashSet<String> set = new LinkedHashSet<>(); // 把List中的所有元素 加到 set 中去重 set.addAll(list); // 先清空list中原有的元素 list.clear(); // 再把set中的元素 全部添加到 list集合中 list.addAll(set); System.out.println(list); } private static void fun5() { // 输入一个字符串,去掉其中重复字符, // 打印出不同的那些字符 // 1.创建set集合 // 2.把接受过来的字符串 转成字符数组 // 3.遍历字符数组 把没听过字符 存入set中 // 4.打印set集合 System.out.println("请输入一个字符串"); Scanner scanner = new Scanner(System.in); String nextLine = scanner.nextLine(); // 转字符数组 char[] charArray = nextLine.toCharArray(); // 创建set集合 HashSet<Object> set = new HashSet<>(); // 遍历 存储 for (int i = 0; i < charArray.length; i++) { set.add(charArray[i]); } System.out.println(set); } private static void fun4() { // 编写一个程序,获取10个1至20的随机数, 要求随机数不能重复 // 去重————>往Set集合上想 // 1.创建一个Set集合 // 2.随机10个数 // 3.把10个数 添加到集合中 // 4.当集合长度 <10 的时候就添加 >=10 的时候就不添加 HashSet<Integer> set = new HashSet<>(); while (set.size() < 10) { if (set.size() == 10) { break; } // 随机数 int num = (int)(Math.random() * (20 - 1 + 1) + 1); // 添加到Set中 set.add(num);// 自动装箱 } System.out.println(set); } private static void fun3() { // 使用LinkedHashSet 保存两个a,b,c,d 打印一下 // inkedHashSet 特点 有序的(怎么存的就可以怎么取出来) // HashSet的之类 LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("a"); linkedHashSet.add("a"); linkedHashSet.add("b"); linkedHashSet.add("b"); linkedHashSet.add("c"); linkedHashSet.add("c"); linkedHashSet.add("d"); linkedHashSet.add("d"); System.out.println(linkedHashSet); } private static void fun2() { // 创建一个HashSet // 保存 5个人 并遍历 // 人为年龄 和姓名一样 就是一个人去重 // 重写equals 方法 // 注意:如果你要使用hashSet去除重复的对象 // 直接重写HashCode() 和 equals()方法 HashSet<Person> hashSet = new HashSet<>(); hashSet.add(new Person("可可", 20)); hashSet.add(new Person("可可", 20)); hashSet.add(new Person("亮亮", 22)); hashSet.add(new Person("亮亮", 22)); hashSet.add(new Person("明明", 24)); hashSet.add(new Person("明明", 24)); for (Person person : hashSet) { System.out.println(person); } } private static void fun1() { // 创建一个HashSet 保存 两个a b c d HashSet<String> set = new HashSet<>(); set.add("a"); set.add("a"); set.add("b"); set.add("b"); set.add("c"); set.add("c"); set.add("d"); set.add("d"); // 使用增强for循环 遍历 for (String string : set) { System.out.println(string); } System.out.println(set); }}
// 重写equals// // 重写失败 没有触发// @Override// public boolean equals(Object obj) {// System.out.println("猜猜看啊!");// Person person = (Person)obj;// return this.name.equals(person.getName())&& this.age == person.getAge();// }
重写 hashCode // HashSet在存储对象 按照哈希值(hashCode)去存储的 // 每存一个对象 都会给这个对象一个哈希值(票) // 当存储对象的hash值相同的时候 // 系统会默认调用equals方法 去比较两个对象是否一样 // 如果一样 就不存 反之 不一样的时候就保存到Set集合中 // hash值不同的时候 就认为 两个对象是不同的 // 所以没有调用equals方法 // 注意:保存对象的时候 先看hash值 // hash值一样再看equals // hash值不一样 就不看equals了 // 现在想提高效率(少调用几次equals方法)
(2)TreeSet :
TreeSet作用 排序 (去重)
private static void fun2() { // 创建一个TreeSet 添加4个人 查看是否有排序效果 TreeSet<Person> set = new TreeSet<>(); set.add(new Person("赵", 15)); set.add(new Person("钱", 16)); set.add(new Person("孙", 17)); set.add(new Person("李", 18)); set.add(new Person("周", 18)); System.out.println(set); System.out.println((int)'赵'); System.out.println((int)'钱'); System.out.println((int)'孙'); System.out.println((int)'李'); System.out.println((int)'周'); }
如果TreeSet 相向里面存储元素 // 就看这个compareTo方法的返回值 /* * 返回0 只有一个值 * 返回正数 按存进去的顺序 正序 * 返回负数 按存进顺序 倒序 * * TreeSet 内部使用 二叉树来存储的 * 比我小的数放左边(返回负数时) * 比我大的数放右边(返回正数时) * 两个数相等(返回0时)不存储 * 打印时候取升序
**3.创建一个比较器的类
实现比较器接口中
主要按字符串长度比较
次要按字符比
比较器 相当于 TreeSet存储规则**
public class ComparatorImpl implements Comparator<String>{ @Override public int compare(String o1, String o2) { int length = o1.length() - o2.length(); int num = length == 0 ? o1.compareTo(o2) : length; // 如果字符串长度和字符都相同 也需要把字符串存进去 // 所以返回1 或 -1 return num == 0 ? 1 : num ; }}
字符的比较
public class CharImpl implements Comparator<Character> { @Override public int compare(Character o1, Character o2) { int num = o1 -o2; return num == 0 ? 1 : num; }}
倒序
public class IntegerImpl implements Comparator<Integer>{ @Override public int compare(Integer o1, Integer o2) { int num = o2 -o1; return num == 0 ? 1 : num; }}
阅读全文
0 0
- Java集合—Set集合
- java——Set集合
- Java集合框架—Set
- java集合(二)——集合 Set
- Java——Java集合Set
- JAVA——集合(Set)
- Java集合框架基础——Set
- Java集合——set总结
- 【Java基础】——Set集合
- JAVA学习笔记——Set集合
- Java集合类—List,Set,Map
- (36)Java学习笔记——集合框架 / Set集合
- 由浅入深理解java集合(二)——集合-Set
- 第8章 Java集合—Collection和Set集合
- 集合——Set集合
- 集合框架—Set
- Java_集合—Set
- java集合---set集合
- ajax前后台交互-js相关语法
- ajax实现改变状态和删除无刷新
- Python学习OS 模块来处理文件和目录
- gradle plugin的版本地址
- Play on Words
- java——Set集合
- Java中导入、导出Excel
- 1076. Wifi密码 (15)
- 1078. 字符串压缩与解压 (20)
- 使用JiaoZiVideoPlayer播放网络视频,暂停继续(三)
- HDU1702 ACboy needs your help again!
- JQUERY获取当前页面的URL信息
- 不使用延迟实现数据帧间的发送
- Tor匿名上网&进入暗网