java集合-set练习题
练习题
TreeSet练习
题目:定义一个Employee类,该类包含:private 成员变量 name age birthtday,其中birthday为MyDate类的对象。并为每一个属性定义 getter, setter 方法,并重写toString方法输出name age birthday
MyDate类包含: private 成员变量 year month day,并为每一个属性定义getter,setter方法
创建该类的5个对象,并把这些对象放入TreeSet集合中
分别按照以下两种方式对集合中的元素进行排序,并遍历输出
- 使Employee实现 Comparable接口,并按name排序
- 创建TreeSet时传入 Comparator对象,按生日日期的先后顺序
code
package com.collection.set.practice;/*** 定义一个Employee类,* 该类包含:private 成员变量 name age birthtday,* 其中birthday为MyDate类的对象。* 并为每一个属性定义 getter, setter 方法,* 并重写toString方法输出name age birthday*/
public class Employee implements Comparable{private String name;private int age;private MyDate birthday;public Employee(String name, int age, MyDate birthday) {this.name = name;this.age = age;this.birthday = birthday;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public MyDate getBirthday() {return birthday;}public void setBirthday(MyDate birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", birthday=" + birthday +'}';}// 按照姓名排序@Overridepublic int compareTo(Object o) {if(o instanceof Employee){Employee e = (Employee)o;return this.name.compareTo(e.name);}//return 0;throw new RuntimeException("传入的数据类型不一致");}
}
package com.collection.set.practice;/*** MyDate类包含: private 成员变量 year month day,* 并为每一个属性定义getter,setter方法*/
public class MyDate implements Comparable{private int year;private int month;private int day;// constructorpublic MyDate(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}// getter and setterpublic int getYear() {return year;}public void setYear(int year) {this.year = year;}public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}// toString@Overridepublic String toString() {return "MyDate{" +"year=" + year +", month=" + month +", day=" + day +'}';}@Overridepublic int compareTo(Object o) {if(o instanceof MyDate){MyDate m = (MyDate)o;//比较年int minusYear = this.getYear() - m.getYear();if(minusYear != 0){return minusYear;}// 比较月int minusMonth = this.getMonth() - m.getMonth();if(minusMonth != 0){return minusMonth;}return this.getDay()-m.getDay();}throw new RuntimeException("not consistant");}
}
package com.collection.set.practice;import com.sun.org.apache.bcel.internal.generic.RETURN;import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;/*** 创建该类的5个对象,并把这些对象放入TreeSet集合中** 分别按照以下两种方式对集合中的元素进行排序,并遍历输出** 1. 使Employee实现 Comparable接口,并按name排序* 2. 创建TreeSet时传入 Comparator对象,按生日日期的先后顺序*/
public class EmployeeTest {public static void main(String[] args) {//test1();test2();}// 问题2:按生日日期的先后排序public static void test2(){TreeSet set = new TreeSet(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {if(o1 instanceof Employee && o2 instanceof Employee){Employee e1 = (Employee)o1;Employee e2 = (Employee)o2;MyDate b1 = e1.getBirthday();MyDate b2 = e2.getBirthday();
// // 方式1:
// // 比较年
// int minusYear = b1.getYear() - b2.getYear();
// if(minusYear != 0){// return minusYear;
// }
// // 比较月
// int minusMonth = b1.getMonth() - b2.getMonth();
// if(minusMonth != 0){// return minusMonth;
// }
// return b1.getDay()-b2.getDay();// 方式2:在MyDate类中实现return b1.compareTo(b2);}//return 0;throw new RuntimeException("传入的数据类型不一致");}});// CREATE 5 OBJECTSEmployee e1 = new Employee("joe",24,new MyDate(1997,11,7));Employee e2 = new Employee("pepper",67,new MyDate(1945,1,23));Employee e3 = new Employee("amy",15,new MyDate(2005,3,6));Employee e4 = new Employee("jenny",26,new MyDate(1995,8,20));Employee e5 = new Employee("lisa",25,new MyDate(1996,9,7));set.add(e1);set.add(e2);set.add(e3);set.add(e4);set.add(e5);Iterator iterator = set.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}// // 问题1:使用自然排序
// public static void test1(){// TreeSet set = new TreeSet();
// // CREATE 5 OBJECTS
// Employee e1 = new Employee("joe",24,new MyDate(1997,11,7));
// Employee e2 = new Employee("pepper",67,new MyDate(1945,1,23));
// Employee e3 = new Employee("amy",15,new MyDate(2005,3,6));
// Employee e4 = new Employee("jenny",26,new MyDate(1995,8,20));
// Employee e5 = new Employee("lisa",25,new MyDate(1996,9,7));
// set.add(e1);
// set.add(e2);
// set.add(e3);
// set.add(e4);
// set.add(e5);
//
// Iterator iterator = set.iterator();
// while(iterator.hasNext()){// System.out.println(iterator.next());
// }
//}
}
在List内去除重复数字值,要求尽量简单
hashSet过滤重复数据,效率较高
package com.collection.set;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;public class Demo01 {public static void main(String[] args) {List list = new ArrayList();list.add(new Integer(1));list.add(new Integer(1));list.add(new Integer(2));list.add(new Integer(2));list.add(new Integer(4));List list2 = duplicateList(list);for(Object integer:list2){System.out.println(integer);}}private static List duplicateList(List list) {HashSet set = new HashSet();set.addAll(list);return new ArrayList(set);}
}
面试题
pubilc void test(){HashSet set = new HashSet();Person p1 = new Person(1001,"AA");Person p2 = new Person(1002,"BB");set.add(p1);set.add(p2);p1.name = "CC";set.remove(p1);System.out.println(set);set.add(new Person(1001,"AA"));System.out.println(set);
}
先计算 HashCode,再 equals()
code
package com.collection.set.practice;public class Person {int id;String name;public Person(int id, String name) {this.id = id;this.name = name;}public Person() {}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;if (id != person.id) return false;return name != null ? name.equals(person.name) : person.name == null;}@Overridepublic int hashCode() {int result = id;result = 31 * result + (name != null ? name.hashCode() : 0);return result;}
}
package com.collection.set.practice;import java.util.HashSet;public class Test {public static void main(String[] args) {test1();}public static void test1(){HashSet set = new HashSet();Person p1 = new Person(1001,"AA");Person p2 = new Person(1002,"BB");set.add(p1);set.add(p2);// System.out.println(set);// [Person{id=1001, name='AA'}, Person{id=1002, name='BB'}]p1.name = "CC";// System.out.println(set);// [Person{id=1001, name='CC'}, Person{id=1002, name='BB'}]set.remove(p1);System.out.println(set);// [Person{id=1002, name='BB'}, Person{id=1001, name='CC'}]// p1是索引,remove计算P1的哈希值,可能找到的不是开始1001的索引,可能为空set.add(new Person(1001,"CC"));System.out.println(set);// [Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}]// 拿 1001 和 "CC" 计算哈希值set.add(new Person(1001,"AA"));System.out.println(set);// [Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}, Person{id=1001, name='AA'}]}
}
java集合-set练习题相关推荐
- JAVA集合专题+源码分析
文章目录 Java集合专题 集合和数组的区别 数组 集合 区别 集合体系结构介绍 单列集合 [Collection ] Collection接口 迭代器 迭代器原理 增强for循环 List接口 对集 ...
- JAVA集合1(Collection接口,iterator()方法,增强型for循环)
JAVA集合框架概述 集合框架涉及到的api List接口是继承Collection接口,Set接口是继承Collection接口, ArrayList 类是一个可以动态修改的数组,与普通数组的区别就 ...
- java 集合 接口_Java集合之Collection接口
1 - Java集合介绍 /* 1. 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储. 2. 另一方面,使用Array存储对象方面具有一些弊 端,而 ...
- java 头尾 队列_超详细的java集合讲解
1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...
- java集合总结_Java中集合总结
Java数组的长度是固定的,为了使程序能够方便地存储和操作数目不固定的一组数据,JDK类库提供了Java集合,这些集合类都位于java.util包中,但是与数组不同的是,集合中不能存放基本类型数据,而 ...
- 考考基础部分,谈谈Java集合中HashSet的原理及常用方法
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:工匠初心 cnblogs.com/LiaHon/p/1125 ...
- Java集合框架综述,这篇让你吃透!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...
- 【Java集合框架】ArrayList类方法简明解析(举例说明)
本文目录 1.API与Java集合框架 2.ArrayList类方法解析 2.1 add() 2.2 addAll() 2.3 clear() 2.4 clone() 2.5 contains() 2 ...
- Java基础篇:Java集合
文章目录 1.概述 2.Collection接口 2.1 Collection接口方法 2.2 Iterator迭代器接口 2.3 Collection子接口之:List接口 2.4 Collecti ...
最新文章
- 黑龙江科技大学计算机类分数线,2019年黑龙江科技大学优势专业排名及分数线...
- QIIME 2教程. 32如何写方法和引用Citing(2020.11)
- 前端小项目:使用canvas绘画哆啦A梦
- 3,maven使用入门
- 我的Go+语言初体验--Go+之环境安装与程序编码初体验
- Linux信号实践(3) --信号内核表示
- C语言试题五十八之请编写函数fun,:计算并输出下列多项式的值(sn=1+1/1!+1/2!+1/3!+1/4!+…+1/n! )
- linux18.2安装界面,Ubuntu 18.10下安装Grub Customizer 5.1.0配置grub2图形化界面
- tempdb页面分配争用问题
- 使用shell编写九九乘法表,mysql分库备份
- java框架有哪几种,java权限框架有几种?常见的权限框架分享
- 黑苹果 无线网卡相关配置
- 爬虫(12)-爬虫爬取安居客二手房和新房信息
- 软件项目管理课程设计-数字化校园学工信息系统
- 数字电路:边沿触发的D触发器简析
- Scan Reorder Formal
- KGB知识图谱在智能问答方向发挥技术特色
- deepin官方历史版本存档
- centos7.5安装snipe-it v5.1.2版本开源资产管理软件
- Springboot+Vue实现发表文章功能
热门文章
- Vue移动端各种机型判断
- RocketMQ常见问题-消息重复消费和消息重复的问题
- 开源OA协同办公平台搭建教程丨服务器端命令:数据导入导出及配置
- 百度for android v5.0,小冰冰传奇百度版下载_小冰冰传奇安卓版下载v5.0.137_3DM手游...
- GEE实战 | LULC获取与处理
- Postman中认证CAS
- 2022-2028全球与中国重型封箱机市场现状及未来发展趋势
- 中泰语快速进行在线翻译的方法
- idea 撤销本地commit 但是未push的代码
- 百胜软件黄飞:携手阿里云,用双中台驱动新零售...