java中集合去重2
1、对集合中的自动定义的对象去重:
自定义Person类,同时复写hashCode和equals方法
package collection;
public class Person {
private String username;
private String password;
public Person() {
super();
}
public Person(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Person [username=" + username + ", password=" + password + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
result = prime * result
+ ((username == null) ? 0 : username.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (username == null) {
if (other.username != null)
return false;
} else if (!username.equals(other.username))
return false;
return true;
}
}
测试去重代码:
@Test
public void test3(){ Person p1 = new Person("张三","zhangsan"); Person p2 = new Person("李四","lisi"); Person p3 = p1; Person p4 = p2; Person p5 = new Person("张三","zhangsan"); Person p6 = new Person("李四","lisi"); List<Person> list1 = new ArrayList<Person>();
list1.add(p1);
list1.add(p2);
list1.add(new Person("小周","xiaozhou"));
list1.add(p3);
list1.add(p4);
list1.add(new Person("小李","小李"));
list1.add(p5);
list1.add(p6);
logger.info(list1);
//Set<Person> set = new HashSet<Person>(list1); List<Person> list2 = new ArrayList<Person>();
if(list2.isEmpty()){
System.out.println("list2是空");
} for (Person person : list1) {
if (!(list2.contains(person))) {
list2.add(person);
}
}
// list1.clear();
// list1.addAll(list2);
logger.info(list2);
} @Test
public void test4(){ Set<Person> set = new LinkedHashSet<Person>();
set.add(new Person("张三", "zhangsan"));
set.add(new Person("张三", "zhangsan"));
set.add(new Person("张三", "12"));
set.add(new Person("李四", "21"));
set.add(new Person("李四", "21"));
set.add(new Person("李四", "45"));
set.add(new Person("王五", "23")); /*for (Iterator<Person> it = set.iterator(); it.hasNext();) {
Person person = it.next(); logger.info(person);
}*/ logger.info(set);
}
补充:
List和Set集合的区别在于:
list集合可以存在相同的元素,set集合则不能。但是同一个元素是根据对象在内存中地址的哈希吗来比较的,也就是说new出的每一个对象在内存中的地址都是不同的。所以set集合想要去重username和password相同的person对象,不一定是可以做到的,除非每次往集合中添加的对象,都是指向之前已经存在容器中对象地址的引用。所以这里我们要复写person类中的hashCode和equals方法。
同时我们又知道set集合中的hashset的数据结构是hash表(散列的数据结构),为了让去重后的set集合依然是有序的,所以这里可以使用hashset的子类linkedhashset,这样去重后的set集合是,有顺序的。
java中集合去重2的更多相关文章
- java中集合去重1
//TreeMap 处理 处理后 得到的值 按拼音排序 TreeMap map = new TreeMap(new MaterialComparator()); map.put("东莞&qu ...
- Java中集合List,Map和Set的区别
Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...
- java中集合Collection转list对象
参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...
- JAVA中集合转数组遍历
JAVA中集合的遍历的一种方法时集合转数组遍历,也是就调用Collection中的toArray(). 代码: public static void main(String[] args) { ...
- Java中集合List,Map和Set的差别
Java中集合List,Map和Set的差别 1.List和Set的父接口是Collection.而Map不是 2.List中的元素是有序的,能够反复的 3.Map是Key-Value映射关系,且Ke ...
- Java中集合的概述
一.集合和数组的区别 1.数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 2.集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数 ...
- Java 单个集合去重与两个集合去重
一.单个集合去重 描述: 去掉一个集合里重复的元素:将list集合转成hashSet集合,hashSet有自动去重的功能,再利用去重后的hashSet集合初始化一个新的list集合,此时这个list就 ...
- Scala中集合类型与java中集合类型转换
对于java中的集合元素并不能在scala中拿来就用的,需要进行相应的转换. 1. 转换规则如下 从下面可以看出,有些可以相互转换的,有些只能单向转换: scala.collection.Iterab ...
- Java中集合关键字的区别
1. ArrayList.Vector和Stack有什么区别? 1.ArrayList的方法和实现基本上和Vector一样,底层都是数组的实现(简:API基本一样) 2.Stack继承了Vec ...
随机推荐
- 如何利用Xshell在Linux下安装jdk
本文会详细介绍如何在Linux下安装JDK1.8 首先要设置虚拟机的IP地址,不知道如何设置的话可以 翻看我的前一篇博客 http://www.cnblogs.com/xiaoxiaoSMILE/ ...
- lintcode-433-岛屿的个数
433-岛屿的个数 给一个01矩阵,求不同的岛屿的个数. 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右为相邻. 样例 在矩阵: [ [1, 1, 0, 0, 0], ...
- lintcode-383-装最多水的容器
383-装最多水的容器 给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai).画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0 ...
- 02_Java基础_第2天(变量、运算符)_讲义
今日内容介绍 1.变量 2.运算符 01变量概述 * A: 什么是变量? * a: 变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器, * 例如水杯是容器,用来装载水:你家里的大衣柜 ...
- [2017BUAA软工]第三次博客作业:案例分析
第三次博客作业:案例分析 1. 调研和评测 1.1 BUG及设计缺陷描述 主要测试博客园在手机端上的使用情况. [BUG 01] 不能后退到上一界面(IOS) 重现步骤:打开博客首页中任意博文,点击博 ...
- vue h render function & render select with options bug
vue h render function & render select with options bug https://github.com/xgqfrms/vue/issues/41 ...
- Kafka发布订阅消息
Maven <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-cli ...
- python的N个小功能(更新文件)
########################################################################## #对于第二份文件:第一份与第二份不相同,以第二份为 ...
- jmeter同步定时器
同步定时器是jmeter中一个比较重要的定时器,同步定时器,相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起并发,可以用来做大数据量的并发请求. 验证 ...
- 【比赛】HNOI2018 毒瘤
虚树+dp 直接看zlttttt的强大题解 zlttttt的题解看这里 #include<bits/stdc++.h> #define ui unsigned int #define ll ...