1、对集合中的自动定义的对象去重:

  自定义Person类,同时复写hashCode和equals方法

  1. package collection;
  2.  
  3. public class Person {
  4.  
  5. private String username;
  6.  
  7. private String password;
  8.  
  9. public Person() {
  10. super();
  11. }
  12.  
  13. public Person(String username, String password) {
  14. super();
  15. this.username = username;
  16. this.password = password;
  17. }
  18.  
  19. public String getUsername() {
  20. return username;
  21. }
  22.  
  23. public void setUsername(String username) {
  24. this.username = username;
  25. }
  26.  
  27. public String getPassword() {
  28. return password;
  29. }
  30.  
  31. public void setPassword(String password) {
  32. this.password = password;
  33. }
  34.  
  35. @Override
  36. public String toString() {
  37. return "Person [username=" + username + ", password=" + password + "]";
  38. }
  39.  
  40. @Override
  41. public int hashCode() {
  42. final int prime = 31;
  43. int result = 1;
  44. result = prime * result
  45. + ((password == null) ? 0 : password.hashCode());
  46. result = prime * result
  47. + ((username == null) ? 0 : username.hashCode());
  48. return result;
  49. }
  50.  
  51. @Override
  52. public boolean equals(Object obj) {
  53. if (this == obj)
  54. return true;
  55. if (obj == null)
  56. return false;
  57. if (getClass() != obj.getClass())
  58. return false;
  59. Person other = (Person) obj;
  60. if (password == null) {
  61. if (other.password != null)
  62. return false;
  63. } else if (!password.equals(other.password))
  64. return false;
  65. if (username == null) {
  66. if (other.username != null)
  67. return false;
  68. } else if (!username.equals(other.username))
  69. return false;
  70. return true;
  71. }
  72.  
  73. }

测试去重代码:

  1. @Test
  2. public void test3(){
  3.  
  4. Person p1 = new Person("张三","zhangsan");
  5.  
  6. Person p2 = new Person("李四","lisi");
  7.  
  8. Person p3 = p1;
  9.  
  10. Person p4 = p2;
  11.  
  12. Person p5 = new Person("张三","zhangsan");
  13.  
  14. Person p6 = new Person("李四","lisi");
  15.  
  16. List<Person> list1 = new ArrayList<Person>();
  17. list1.add(p1);
  18. list1.add(p2);
  19. list1.add(new Person("小周","xiaozhou"));
  20. list1.add(p3);
  21. list1.add(p4);
  22. list1.add(new Person("小李","小李"));
  23. list1.add(p5);
  24. list1.add(p6);
  25. logger.info(list1);
  26. //Set<Person> set = new HashSet<Person>(list1);
  27.  
  28. List<Person> list2 = new ArrayList<Person>();
  29. if(list2.isEmpty()){
  30. System.out.println("list2是空");
  31. }
  32.  
  33. for (Person person : list1) {
  34. if (!(list2.contains(person))) {
  35. list2.add(person);
  36. }
  37. }
  38. // list1.clear();
  39. // list1.addAll(list2);
  40. logger.info(list2);
  41. }
  42.  
  43. @Test
  44. public void test4(){
  45.  
  46. Set<Person> set = new LinkedHashSet<Person>();
  47. set.add(new Person("张三", "zhangsan"));
  48. set.add(new Person("张三", "zhangsan"));
  49. set.add(new Person("张三", "12"));
  50. set.add(new Person("李四", "21"));
  51. set.add(new Person("李四", "21"));
  52. set.add(new Person("李四", "45"));
  53. set.add(new Person("王五", "23"));
  54.  
  55. /*for (Iterator<Person> it = set.iterator(); it.hasNext();) {
  56. Person person = it.next();
  57.  
  58. logger.info(person);
  59. }*/
  60.  
  61. logger.info(set);
  62. }

补充:

List和Set集合的区别在于:

list集合可以存在相同的元素,set集合则不能。但是同一个元素是根据对象在内存中地址的哈希吗来比较的,也就是说new出的每一个对象在内存中的地址都是不同的。所以set集合想要去重username和password相同的person对象,不一定是可以做到的,除非每次往集合中添加的对象,都是指向之前已经存在容器中对象地址的引用。所以这里我们要复写person类中的hashCode和equals方法。

同时我们又知道set集合中的hashset的数据结构是hash表(散列的数据结构),为了让去重后的set集合依然是有序的,所以这里可以使用hashset的子类linkedhashset,这样去重后的set集合是,有顺序的。

java中集合去重2的更多相关文章

  1. java中集合去重1

    //TreeMap 处理 处理后 得到的值 按拼音排序 TreeMap map = new TreeMap(new MaterialComparator()); map.put("东莞&qu ...

  2. Java中集合List,Map和Set的区别

    Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...

  3. java中集合Collection转list对象

    参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...

  4. JAVA中集合转数组遍历

    JAVA中集合的遍历的一种方法时集合转数组遍历,也是就调用Collection中的toArray(). 代码: public static void main(String[] args) {     ...

  5. Java中集合List,Map和Set的差别

    Java中集合List,Map和Set的差别 1.List和Set的父接口是Collection.而Map不是 2.List中的元素是有序的,能够反复的 3.Map是Key-Value映射关系,且Ke ...

  6. Java中集合的概述

    一.集合和数组的区别 1.数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 2.集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数 ...

  7. Java 单个集合去重与两个集合去重

    一.单个集合去重 描述: 去掉一个集合里重复的元素:将list集合转成hashSet集合,hashSet有自动去重的功能,再利用去重后的hashSet集合初始化一个新的list集合,此时这个list就 ...

  8. Scala中集合类型与java中集合类型转换

    对于java中的集合元素并不能在scala中拿来就用的,需要进行相应的转换. 1. 转换规则如下 从下面可以看出,有些可以相互转换的,有些只能单向转换: scala.collection.Iterab ...

  9. Java中集合关键字的区别

    1. ArrayList.Vector和Stack有什么区别? 1.ArrayList的方法和实现基本上和Vector一样,底层都是数组的实现(简:API基本一样) ​   2.Stack继承了Vec ...

随机推荐

  1. 利用canvas对上传图片进行上传前压缩

    利用谷歌调式工具发现,图片大小直接影响着首屏加载时间. 且考虑到后期服务端压力,图片压缩特别必要. 本文是前端利用canvas实现图片.参考文章:https://www.cnblogs.com/007 ...

  2. CentOS系统iptables防火墙的启动、停止以及开启关闭端口的操作

    CentOS 配置防火墙操作实例(启.停.开.闭端口):注:防火墙的基本操作命令:查询防火墙状态:[root@localhost ~]# service   iptables status停止防火墙: ...

  3. [CB] Windows10为什么质量变差 bug越来越多

    在 Windows 10 发布之后,微软转向了软件即服务模式,每半年释出一个新版本,通过增加更新频率将新的特性不断推送给用户. 在以前,微软产品发布周期是两到三年,其开发流程分成多个阶段:设计和策划. ...

  4. Linux服务器ping不通域名出现的unknown host 错误解决办法

    "ping: unknown host www.baidu.com" 解决方法 如果某台Linux服务器ping不通域名, 如下提示: # ping www.baidu.compi ...

  5. C# WebBrowser控件模拟登录

    一.问题点: 1.模拟登录后,如果带有嵌套的iframe嵌套,不好读取iframe内容,可以直接指定iframe抓取网址 2.C# 清除WebBrowser控件的Session和Cookie 参考文档 ...

  6. 第129天:node.js安装方法

    node.js安装方法 第一步:双击node.js安装包开始安装,注意64位和32位,按照自己的进行安装 第二步:在安装过程中一直选择next,在选择安装目录时,大多数默认安装在C盘,我安装在了D盘, ...

  7. WebClient的使用

    1.下载网页源码: private void button1_Click(object sender, EventArgs e) { string url = textBox1.Text; strin ...

  8. MVC SignalR Hub初学

    具体有关SignalR的说明查网上,我这里简单列举一个例子 1.新建MVC,添加SignalR引用(NuGet安装). 2.添加OWIN START类 public class Startup { p ...

  9. 2个 List<T>进行数据合并

    var userF = new List<User>(); User m1 = new User() { Id = "0" }; userF.Add(m1); var ...

  10. TechDay公开课实录:PaddlePaddle车牌识别实战和心得

    车牌识别作为一种常见的图像识别的应用场景,已经是一个非常成熟的业务了,在传统的车牌识别中,可以使用字符分割+字符识别的方式来进行车牌识别,而深度学习兴起后,出现了很多端到端的车牌识别模型,不用分割字符 ...