【Java】两个ArrayList之间求交并补

同样的方法应该也使用在《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接)中提及到Java中的各类集合,这里拿各位编程最常用的ArrayList做例子。这个东西除了用来做可变形数组以外,有时候还会出现要在两个ArrayList之间进行集合运算,我在这里举出最常见的求交并补的例子,其余的复杂的集合运算,请自己打开《离散数学》或者《数理逻辑》一书慢慢推导吧。我们是程序猿,不是数学家,要在两个ArrayList之间求交并补已经很少见了,何况其它……

这里的交并补不需要通过for循环等实现,这里类本身封装好方法。

1、首先是最简单的交集,用一个已经封装好的retainAll就解决问题了:

比如以下的语句段,设置一个{1,2,3}与{3,4}的ArrayList求交:

ArrayList<Integer> arraylist1 = new ArrayList<Integer>();
ArrayList<Integer> arraylist2 = new ArrayList<Integer>();
arraylist1.add(1);arraylist1.add(2);arraylist1.add(3);
arraylist2.add(3);arraylist2.add(4);
arraylist1.retainAll(arraylist2);
System.out.println("Arraylist1∩Arraylist2="+arraylist1);

就可以得到如下的运行结果:

Arraylist1∩Arraylist2=[3]

这里值得注意的是,不要写成:arraylist1=arraylist1.retainAll(arraylist2);,arraylist1.retainAll(arraylist2);本身就完成arraylist1与arraylist2求交,并且更新arraylist1的操作,arraylist1.retainAll(arraylist2);执行成功则返回一个true,当然,我就从来没见过它执行失败,返回false的。arraylist1是一个存放整形的ArrayList<Integer>,根本就不能相等,这样写Eclipse绝对会报错。这里求交集arraylist1与arraylist2的顺序没有问题的,只是求完之后更新哪个arraylist的问题。

2、之后是求补集,也是用一个封装好的removeAll就解决问题:

比如以下的语句段,设置一个{3}对于全集{1,2,3}求补:

ArrayList<Integer> arraylist1 = new ArrayList<Integer>();
ArrayList<Integer> arraylist2 = new ArrayList<Integer>();
arraylist1.add(1);arraylist1.add(2);arraylist1.add(3);
arraylist2.add(3);
arraylist1.removeAll(arraylist2);
System.out.println("┐Arraylist2(对于Arraylist1)="+arraylist1);

运行结果如下:

┐Arraylist2(对于Arraylist1)=[1, 2]

这里要注意的问题同上面的交集,如果你这样写,以下是错误示范:

ArrayList<Integer> arraylist1 = new ArrayList<Integer>();
ArrayList<Integer> arraylist2 = new ArrayList<Integer>();
arraylist1.add(1);arraylist1.add(2);arraylist1.add(3);
arraylist2.add(3);
System.out.println("┐Arraylist2(对于Arraylist1)"+arraylist1.removeAll(arraylist2));

那么则得到下面的运行结果:

┐Arraylist2(对于Arraylist1)true

而不是┐Arraylist2(对于Arraylist1)=[1, 2],原因同交集

3、并集则不同,这里没有封装好方法,我们写一个方法,把要求并的两个ArrayList的所有元素叠加在一起,再去重,去重可以利用上次我在《【Java】为ArrayList去重》(点击打开链接)介绍的方法

比如:

import java.util.*;

class ArraylistCalculate{
	// 两个整数集求并集
	public ArrayList<Integer> integerArrayListUnion(
			ArrayList<Integer> arraylist1, ArrayList<Integer> arraylist2) {
		ArrayList<Integer> arraylist = new ArrayList<Integer>();
		arraylist.addAll(arraylist1);
		arraylist.addAll(arraylist2);
		arraylist = new ArrayList<Integer>(new HashSet<Integer>(arraylist));
		return arraylist;
	}

}

public class JavaArraylistCalculate {
	public static void main(String args[]){
		ArrayList<Integer> arraylist1 = new ArrayList<Integer>();
		ArrayList<Integer> arraylist2 = new ArrayList<Integer>();
		arraylist1.add(1);arraylist1.add(2);arraylist1.add(3);
		arraylist2.add(3);arraylist2.add(4);
		System.out.println("Arraylist1∪Arraylist2="+new ArraylistCalculate().integerArrayListUnion(arraylist1, arraylist2));

	}
}

运行结果如下:

Arraylist1∪Arraylist2=[1, 2, 3, 4]

当然,我们也可以把上述介绍得两个ArrayList之间求交并补的所有方法封装起来,得到如下的类:

class ArraylistCalculate{
	// 两个整数集求差集
	public ArrayList<Integer> integerArrayListDifference(
			ArrayList<Integer> arraylist1, ArrayList<Integer> arraylist2) {
		arraylist1.removeAll(arraylist2);
		return arraylist1;
	}

	// 两个整数集求并集
	public ArrayList<Integer> integerArrayListUnion(
			ArrayList<Integer> arraylist1, ArrayList<Integer> arraylist2) {
		ArrayList<Integer> arraylist = new ArrayList<Integer>();
		arraylist.addAll(arraylist1);
		arraylist.addAll(arraylist2);
		arraylist = new ArrayList<Integer>(new HashSet<Integer>(arraylist));
		return arraylist;
	}
	// 两个整数集求交集
	public ArrayList<Integer> integerArrayListIntersections(
			ArrayList<Integer> arraylist1, ArrayList<Integer> arraylist2) {
		arraylist1.retainAll(arraylist2);
		return arraylist1;
	}
}

需要的时候调用就可以了。

当然,由于用到了ArrayList请注意在开头引用import java.util.*;

时间: 2024-10-10 02:31:46

【Java】两个ArrayList之间求交并补的相关文章

java多线程并发——Exchanger 两个任务之间交换对象

package org.rui.thread.newc; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurre

java计算两个日期之间相差天数和相隔天数详解

大家看到文章标题"两个日期之间相差天数和相隔天数",是否有疑惑呢!从中文字面理解,"相差"和"相隔"是有区别的,然而就是这些区别害死很多人,却没有发现,在大量新增统计时是差之毫厘谬以千里,我能都发现是因为一个偶然的机会,一个项目运行几年却没有人发现,我在其中还不到一年,一开始写这些这代码的人根本没分清楚什么情况就写了,怪不得统计的数据总是有那么细微的差别,在于日期"相差"和"相隔"有某些特定的情况下是相等的

计算两个日期之间的天数差C++/java

1--Java 分析:调用java中Calendar类 int days(Date date1,Date date2){ Calendar cal = new Calendar.getInstance(); cal.setTime(date1); int time1 = cal.get(Calendar.DAY_OF_YEAR); cal.setTime(date2); int time2 = cal.get(Calendar.DAY_OF_YEAR); //long days = Math.a

java计算两个日期之间相隔的天数

1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3 import java.util.Calendar; 4 import java.util.Date; 5 6 7 public class date { 8 9 /** 10 * @param args 11 * @throws ParseException 12 */ 13 public static void main(String[] arg

Java 根据给定的日期,计算两个日期之间的时间差

计算两个Date之间的时间差,基本思路为把Date转换为ms(微秒),然后计算两个微秒时间差. 时间的兑换规则如下: 1s秒 = 1000ms毫秒 1min分种 = 60s秒 1hours小时 = 60min分钟 1day天 = 24hours小时 package com.qiyadeng.date; import java.text.SimpleDateFormat; import java.util.Date; public class DateDifferentExample { publ

java 集合交并补

通过使用泛型方法和Set来表达数学中的表达式:集合的交并补.在下面三个方法中都将第一个參数Set复制了一份,并未直接改动參数中Set. package Set; import java.util.HashSet; import java.util.Set; public class Sets { public static <T> Set<T> intersection(Set<T> s1, Set<T> s2) { Set<T> result

求两个日期之间间隔的天数,Python实现

代码如下 1 def leap_year(y): #判断是否是闰年 2 if (y % 4 == 0 and y % 100 != 0) or y % 400 == 0: 3 return True 4 else: 5 return False 6 7 def days_in_month(y, m): #判断每个月都有几天 8 if m in [1, 3, 5, 7, 8, 10, 12]: 9 return 31 10 elif m in [4, 6, 9, 11]: 11 return 30

Java 获取两个日期之间的日期

1.前期需求,两个日期,我们叫他startDate和endDate,然后获取到两个日期之间的日期 /** * 获取两个日期之间的日期 * @param start 开始日期 * @param end 结束日期 * @return 日期集合 */ private List<Date> getBetweenDates(Date start, Date end) { List<Date> result = new ArrayList<Date>(); Calendar tem

Java对两个int类型求百分比的方法

今天制作一个统计报表导出功能,把Java对两个int类型求百分比的处理方法在博客整理一下,给后来有需要的人提供帮助!顺便纪念一下项目的统计功能基本没有问题,就差导出了! 现将代码整理如下: int diliverNum=3;//举例子的变量 int queryMailNum=9;//举例子的变量 // 创建一个数值格式化对象 NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.se