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 ...
随机推荐
- ZOJ 1842 Prime Distance(素数筛选法2次使用)
Prime Distance Time Limit: 2 Seconds Memory Limit: 65536 KB The branch of mathematics called nu ...
- Codeforces Round #287 (Div. 2) E. Breaking Good 最短路
题目链接: http://codeforces.com/problemset/problem/507/E E. Breaking Good time limit per test2 secondsme ...
- 【leetcode】300.Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- 常用的一些sql
--根据某一列中包括的逗号将一行数据变多行 select a,c from (with test as (select 'abc' a,'1,2,3' c from dual e) select a, ...
- Java ISO 8601时间格式转换
common-lang包: String pattern = "YYYY-MM-dd'T'HH:mm:ssZZ"; System.out.println(DateFormatUti ...
- Qt的编程风格与规范
Qt的编程风格与规范 来源: http://blog.csdn.net/qq_35488967/article/details/70055490 参考资料: https://wiki.qt.io/Qt ...
- 【JavaScript】事件
一.前言 继续上一章的内容,继续今天的Js学习. 二.内容 事件处理程序 事件就是用户或浏览器自身执行的某种动作.而响应某个事件的函数就叫做事件处理程序 //HTML事 ...
- 常州day1p3
给定一个 n 行 m 列的方格,每个格子里有一个正整数 a,1 ≤ a ≤ k,k ≤ n∗m 假设你当前时刻站在 (i,j) 这个格子里,你想要移动到 (x,y),那必须满足以下三个条件 1:i & ...
- 【BZOJ2138】stone(线段树,Hall定理)
[BZOJ2138]stone(线段树,Hall定理) 题面 BZOJ 题解 考虑一个暴力. 我们对于每堆石子和每个询问,显然是匹配的操作. 所以可以把石子拆成\(a_i\)个,询问点拆成\(K_i\ ...
- 【BZOJ2432】【NOI2011】兔农(数论,矩阵快速幂)
[BZOJ2432][NOI2011]兔农(数论,矩阵快速幂) 题面 BZOJ 题解 这题\(75\)分就是送的,我什么都不想写. 先手玩一下,发现每次每次出现\(mod\ K=1\)的数之后 把它减 ...