练习题


TreeSet练习

题目:定义一个Employee类,该类包含:private 成员变量 name age birthtday,其中birthday为MyDate类的对象。并为每一个属性定义 getter, setter 方法,并重写toString方法输出name age birthday

MyDate类包含: private 成员变量 year month day,并为每一个属性定义getter,setter方法

创建该类的5个对象,并把这些对象放入TreeSet集合中

分别按照以下两种方式对集合中的元素进行排序,并遍历输出

  1. 使Employee实现 Comparable接口,并按name排序
  2. 创建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练习题相关推荐

  1. JAVA集合专题+源码分析

    文章目录 Java集合专题 集合和数组的区别 数组 集合 区别 集合体系结构介绍 单列集合 [Collection ] Collection接口 迭代器 迭代器原理 增强for循环 List接口 对集 ...

  2. JAVA集合1(Collection接口,iterator()方法,增强型for循环)

    JAVA集合框架概述 集合框架涉及到的api List接口是继承Collection接口,Set接口是继承Collection接口, ArrayList 类是一个可以动态修改的数组,与普通数组的区别就 ...

  3. java 集合 接口_Java集合之Collection接口

    1 - Java集合介绍 /* 1. 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储. 2. 另一方面,使用Array存储对象方面具有一些弊 端,而 ...

  4. java 头尾 队列_超详细的java集合讲解

    1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...

  5. java集合总结_Java中集合总结

    Java数组的长度是固定的,为了使程序能够方便地存储和操作数目不固定的一组数据,JDK类库提供了Java集合,这些集合类都位于java.util包中,但是与数组不同的是,集合中不能存放基本类型数据,而 ...

  6. 考考基础部分,谈谈Java集合中HashSet的原理及常用方法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:工匠初心 cnblogs.com/LiaHon/p/1125 ...

  7. Java集合框架综述,这篇让你吃透!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...

  8. 【Java集合框架】ArrayList类方法简明解析(举例说明)

    本文目录 1.API与Java集合框架 2.ArrayList类方法解析 2.1 add() 2.2 addAll() 2.3 clear() 2.4 clone() 2.5 contains() 2 ...

  9. Java基础篇:Java集合

    文章目录 1.概述 2.Collection接口 2.1 Collection接口方法 2.2 Iterator迭代器接口 2.3 Collection子接口之:List接口 2.4 Collecti ...

最新文章

  1. 黑龙江科技大学计算机类分数线,2019年黑龙江科技大学优势专业排名及分数线...
  2. QIIME 2教程. 32如何写方法和引用Citing(2020.11)
  3. 前端小项目:使用canvas绘画哆啦A梦
  4. 3,maven使用入门
  5. 我的Go+语言初体验--Go+之环境安装与程序编码初体验
  6. Linux信号实践(3) --信号内核表示
  7. C语言试题五十八之请编写函数fun,:计算并输出下列多项式的值(sn=1+1/1!+1/2!+1/3!+1/4!+…+1/n! )
  8. linux18.2安装界面,Ubuntu 18.10下安装Grub Customizer 5.1.0配置grub2图形化界面
  9. tempdb页面分配争用问题
  10. 使用shell编写九九乘法表,mysql分库备份
  11. java框架有哪几种,java权限框架有几种?常见的权限框架分享
  12. 黑苹果 无线网卡相关配置
  13. 爬虫(12)-爬虫爬取安居客二手房和新房信息
  14. 软件项目管理课程设计-数字化校园学工信息系统
  15. 数字电路:边沿触发的D触发器简析
  16. Scan Reorder Formal
  17. KGB知识图谱在智能问答方向发挥技术特色
  18. deepin官方历史版本存档
  19. centos7.5安装snipe-it v5.1.2版本开源资产管理软件
  20. Springboot+Vue实现发表文章功能

热门文章

  1. Vue移动端各种机型判断
  2. RocketMQ常见问题-消息重复消费和消息重复的问题
  3. 开源OA协同办公平台搭建教程丨服务器端命令:数据导入导出及配置
  4. 百度for android v5.0,小冰冰传奇百度版下载_小冰冰传奇安卓版下载v5.0.137_3DM手游...
  5. GEE实战 | LULC获取与处理
  6. Postman中认证CAS
  7. 2022-2028全球与中国重型封箱机市场现状及未来发展趋势
  8. 中泰语快速进行在线翻译的方法
  9. idea 撤销本地commit 但是未push的代码
  10. 百胜软件黄飞:携手阿里云,用双中台驱动新零售...