java求两个集合的交集和并集,比较器
求连个集合的交集:
import java.util.ArrayList;
import java.util.List;
public class TestCollection {
public static void main(String[] args) {
List<String> strList = new ArrayList<String>();
List<String> strList2 = new ArrayList<String>();
for(int i = 0; i < 10; i ++) {
strList.add("aaa>>" + i);
strList2.add("aaa>>" + (10 - i));
} //求出交集
strList2.retainAll(strList);
System.out.println("交集大小:" + strList2.size()); for(int i = 0; i < strList2.size(); i++) {
System.out.println(strList2.get(i));
}
}
}
求两个集合的并集:
import java.util.ArrayList;
import java.util.List;
public class TestCollection {
public static void main(String[] args) {
List<String> strList = new ArrayList<String>();
List<String> strList2 = new ArrayList<String>();
for(int i = 0; i < 10; i ++) {
strList.add("aaa>>" + i);
strList2.add("aaa>>" + (10 - i));
}
//求出并集
strList2.removeAll(strList);
strList2.addAll(strList);
System.out.println("并集大小:" + strList2.size()); for(int i = 0; i < strList2.size(); i++) {
System.out.println(strList2.get(i));
}
}
}
3.差集:由属于A又不属于B的元素组成的叫差集
list1.remove(list2);
4.去重并排序
package twolist;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ListMapSort {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
List<Map<String,Object>> listMap1 = new LinkedList<Map<String,Object>>();
Map<String,Object> map = new HashMap<String, Object>();
map.put("date", 20121010);
listMap1.add(map);
map = new HashMap<String, Object>();
map.put("date", 20011213);
listMap1.add(map);
listMap1.add(map);
map = new HashMap<String, Object>();
map.put("date", 20130502);
listMap1.add(map);
System.out.println("原始"+listMap1);
List<Map<String,Object>> listMap2 = new LinkedList<Map<String,Object>>();
Set<Map> setMap = new HashSet<Map>();
for(Map<String,Object> map1 : listMap1){
if(setMap.add(map1)){
listMap2.add(map1);
}
}
System.out.println("去重"+listMap2);
Collections.sort(listMap2, new Comparator<Map<String,Object>>(){
public int compare(Map<String,Object> o1,Map<String,Object> o2){
return o1.get("date").toString().compareTo(o2.get("date").toString());
}
});
System.out.println("排序:"+listMap2);
}
}
java中Comparable和Comparator两种比较器的区别
通常对象之间的比较可以从两个方面去看:
第一个方面:对象的地址是否一样,也就是是否引用自同一个对象。这种方式可以直接使用“==“来完成。
第二个方面:以对象的某一个属性的角度去比较。
对于JDK8而言,有三种实现对象比较的方法:
1、覆写Object类的equals()方法;
2、继承Comparable接口,并实现compareTo()方法;
3、定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。
由于使用的排序方式的不同,具体选择哪种方法来实现对象的比较也会有所不同。
Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比较器,而Comparator是外部比较器,基本的写法如下:
class Apple implements Comparable<Apple>{
int id;
double price;
public Apple(int id, double price) {
this.id = id;
this.price = price;
}
public int compareTo(Apple o) {
//return Double.compare(this.getPrice(),o.getPrice());
if (Math.abs(this.price-o.price)<0.001)
return 0;
else
return (o.price-this.price)>0?1:-1;
}
@Override
public String toString() {
return "Apple{" +
"id=" + id +
", price=" + price +
'}';
}
}
class AESComparator implements Comparator<Apple>{
public int compare(Apple o1, Apple o2) {
if (Math.abs(o1.price-o2.price)<0.001)
return 0;
else{
return (o1.price-o2.price)>0?1:-1;
}
}
}
实现了Comparable接口的类需要实现compareTo()方法,传入一个外部参数进行比对,实现了Comparator接口的方法需要实现compare()方法,对外部传入的两个类进行比较,从而让外部方法在比较时调用。
先了解一下Arrays和Collections.sort(list, new MyComparator());//传入list和比较器排序
了解比较器之前首先来了解一下java.util包下的Arrays类。这个类主要提供了各种操作数组的方法。最常用的几个方法:
Arrays.toString(T[] data) //将数组以字符串的形式返回
Arrays.sort(T[] data)//将数组按指定的比较规则以升序的顺序排序,T类需要实现Comparable接口
Arrays.sort(T[],Comparator<? super T>)//将数组按指定的比较器以升序的顺序排序
Arrays.fill(T[] data,T val)//数组的每一个元素赋值为val
比较器之Comparable<T>接口
实现对象之间的比较有两个方法,第一个方法就是实现Compatable接口。Comparable接口是java.lang包下的。该接口只有一个方法: int compareTo(T o)//返回三种情况:负整数、0、正整数。分别表示小于、等于、大于
当我们想要比较两个对象的大小时,由于栈中存的是对象的地址,所以无法比较。于是我们需要实现Comparable接口,并且重写compareTo方法。其实,String类就是实现了Comparable接口,才有了compareTo()的方法。
比较器之Comparator<T>接口
实现对象的比较第二个方法是额外写一个比较工具类,该工具类需要实现Comparator接口。既然有了Comparable接口可以实现比较,为什么还要有Comparator接口呢?因为Comparable接口在类定义的时候就要实现好Comparable的compareTo()方法。假设我已经写好了City类,不想再改变改类的内部结构,这时我们就可以通过再写一个工具类来实现City类的比较。另外,通过多个工具类可以实现多种不同的比较方法。
public class A{
public xxxx fun(){
//业务逻辑
//xxxxxxxxxxxxxxxxxxx
//排序
Collections.sort(myList, new MyComparator(configValueList));
}
/**
*内部类实现排序
*configValueList 排序规则
*根据DtoList中的某一个字段,按照configValueList配置的规则来排序
*如configValueList ["a","b","c"]
*myList myList.get[0].getVal() = b,myList.get[1].getVal() = a,myList.get[2].getVal() = c
*那么排序后 myList.get[0].getVal() = a,myList.get[1].getVal() = b,myList.get[2].getVal() = c
*/
class MyComparator implements Comparator<Dto> {
private List<String> configValueList;
public MyComparator(List<String> configValueList) {
this.configValueList = configValueList;
}
@Override
public int compare(Dto dto1, Dto dto2) {
if(CollectionUtils.isEmpty(configValueList) || dto1 == null || dto2 == null){
return 0;
}
String val1 = dto1.getVal();
String val2 = dto2.getVal();
if(StringUtils.isBlank(val1) || StringUtils.isBlank(val2)){
return 0;
}
int sort1 = configValueList.indexOf(val1);
int sort2 = configValueList.indexOf(val2);
if(-1 == sort1 || -1 == sort2){
return 0;
}
return sort1 - sort2;
}
}
}
或者这样内部类
public class TestSorting {
public static void main(String[] args) {
List<Developer> listDevs = getDevelopers();
Collections.sort(listDevs, new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge() - o2.getAge();
}
});
for (Developer developer : listDevs) {
System.out.println(developer);
}
}
private static List<Developer> getDevelopers() {
List<Developer> result = new ArrayList<Developer>();
result.add(new Developer("mkyong", new BigDecimal("70000"), 33));
result.add(new Developer("alvin", new BigDecimal("80000"), 20));
result.add(new Developer("jason", new BigDecimal("100000"), 10));
result.add(new Developer("iris", new BigDecimal("10000"), 23));
return result;
}
}
在Java8使用Lamdba排序
public class TestSortingLamdba {
public static void main(String[] args) {
List<Developer> listDevs = getDevelopers();
listDevs.sort((Developer o1, Developer o2) -> o1.getAge() - o2.getAge());
listDevs.forEach(System.out::println);
System.out.println("----------------");
listDevs.sort((o1, o2) -> o1.getName().compareTo(o2.getName()));
listDevs.forEach(System.out::println);
System.out.println("----------------");
listDevs.sort(Comparator.comparing(Developer::getSalary));
listDevs.forEach(System.out::println);
System.out.println("----------------");
listDevs.sort(Comparator.comparing(Developer::getSalary).reversed());
listDevs.forEach(System.out::println);
}
private static List<Developer> getDevelopers() {
List<Developer> result = new ArrayList<Developer>();
result.add(new Developer("mkyong", new BigDecimal("70000"), 33));
result.add(new Developer("alvin", new BigDecimal("80000"), 20));
result.add(new Developer("jason", new BigDecimal("100000"), 10));
result.add(new Developer("iris", new BigDecimal("10000"), 23));
return result;
}
}
java求两个集合的交集和并集,比较器的更多相关文章
- 求两个集合的交集和并集C#
我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...
- [java] 求2个集合的交 差 并集
要求2个集合的交 差 并集. set集合,如下 import java.util.HashSet; import java.util.Set; public class SetTest { publi ...
- 求两个list的交集和并集
两个list的并集,只需去除重复元素即可: 将两个list放入同一个set中即可: 两个list的交集: 1将其中一个list放入set, 2循环另一个list,每次向set塞值, 3判断set的总数 ...
- java求两个集合的差集
public static void main(String[] args) {Set set = new HashSet();Set set1 = new HashSet();set.add(&qu ...
- C# 数组比较--取得两个集合的交集,差集,并集的方法
方法关键字: 交集:Intersect 差集:Except 并集:Union 使用代码: , , , , }; , , , , }; var 交集 = arr1.Intersect(arr2).ToL ...
- js取两个数组的交集|差集|并集|补集|去重示例代码
http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...
- java用最少循环求两个数组的交集、差集、并集
import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List ...
- java使用bitmap求两个数组的交集
一般来说int代表一个数字,但是如果利用每一个位 ,则可以表示32个数字 ,在数据量极大的情况下可以显著的减轻内存的负担.我们就以int为例构造一个bitmap,并使用其来解决一个简单的问题:求两个数 ...
- Python3.7.1学习(三)求两个list的差集、并集与交集
在python3.7.1对列表的处理中,会经常使用到Python求两个list的差集.交集与并集的方法. 下面就以实例形式对此加以分析. # 求两个list的差集.并集与交集# 一.两个list差集# ...
随机推荐
- Linux进程间通信 共享内存+信号量+简单样例
每个进程都有着自己独立的地址空间,比方程序之前申请了一块内存.当调用fork函数之后.父进程和子进程所使用的是不同的内存. 因此进程间的通信,不像线程间通信那么简单.可是共享内存编程接口能够让一个进程 ...
- [翻译角]Headline English: A Captain Should Be Pitch Perfect at a Multitude of Skills (ESLPOD Blog)
以下转自www.eslpod.com,翻译为本人添加.其余版权均归原网站所有. ESLPOD是一个英语学习网站,我最初知道这个网站,是因为“奶爸”<把你的英语用起来>(电子版3元)一书的推 ...
- NTFS文件系统的单个文件最大到底有多大?
于NTFS文件系统的单个文件最大到底有多大? 闲来无事突然想到这个问题,到网上搜索了一下也没有一个固定的解释. 于是到微软官方知识库去寻找答案: 注意:基础硬件限制可能会对任何文件系统施加额外的分区大 ...
- [RK3288][Android6.0] Display驱动初始化流程小结【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/52584903 Platform: RK3288OS: Android 6.0Kernel: ...
- POJ 2562:Primary Arithmetic
Primary Arithmetic Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11135 Accepted: 40 ...
- MFC ListControl技巧汇总
转自:http://hi.baidu.com/qi_xian/blog/item/1971aa22da89ada24723e856.html 以下未经说明,listctrl默认view 风格为repo ...
- luogu 1083 借教室
题目大意: 有一些教室 我们需要处理接下来n天的借教室信息 其中第i天学校有ri个教室可供租借 共有m份订单 每份订单用三个正整数描述 分别为dj sj tj 表示从第sj天到第tj天租借教室 每天需 ...
- 35. extjs MessageBox里fn:是什么意思
function的缩写,用来指定回调函数,就是你点击确定或取消按钮之类的按钮以后触发的事件Ext.Msg.show({ title:'自定义消息框', msg:'这是一个自定义消息框,想怎么搞就怎么搞 ...
- springAOP配置XML方式配置切面报错error at ::0 formal unbound in pointcut
[错误配置文件] <aop:config> <aop:pointcut expression="execution(* net.fifteenho.service.impl ...
- bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】
二分答案,然后dp判断是否合法 具体方法是设f[u]为u点到其子树中的最长链,每次把所有儿子的f值取出来排序,如果某两条能组合出大于mid的链就断掉f较大的一条 a是全局数组!!所以要先dfs完子树才 ...