用java编写程序,求集合的并集、交集和差集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java编写程序,求集合的并集、交集和差集相关的知识,希望对你有一定的参考价值。

有集合A=1,2,3,4和B=1,3,7,9,11, 编写一个应用程序输出A和B交集、并集和差集
解题思路:
 并集是指两个集合合并,但是去掉重复的元素的集合。可以使用HashSet类的addAll的方法将两个集合合并
 交集是指两个集合中都有的元素组成的集合,可以使用HashSet类的retainAll的方法得到两个集合的交集
 差集是指属于A集合但是不属于B集合的元素组成的集合

参考技术A public static void  main(String[] args) 
     Integer[] A = 1,2,3,4;
     Integer[] B = 1,3,7,9,11;
    
     List<Integer> listA = Arrays.asList(A);
     List<Integer> listB = Arrays.asList(B);
    
     List<Integer> jiaoji = new ArrayList<Integer>();
     for(Integer a:listA)
     if(listB.contains(a))
     jiaoji.add(a);
    
    
     System.out.println(jiaoji);
     List<Integer> bingji = new ArrayList<Integer>();
     for(Integer a:listA)
     if(!bingji.contains(a))
     bingji.add(a);
    
    
     for(Integer b:listB)
     if(!bingji.contains(b))
     bingji.add(b);
    
    
    
     System.out.println(bingji);
    
     List<Integer> chaji = new ArrayList<Integer>();
     for(Integer a:listA)
     if(!listB.contains(a))
     chaji.add(a);
    
    
     System.out.println(chaji);
    

参考技术B package yeyu;

import java.util.ArrayList;

public class Jiaoji

/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub
ArrayList<Integer> list=new ArrayList<Integer>();
ArrayList<Integer> list2=new ArrayList<Integer>();
ArrayList<Integer> list3=new ArrayList<Integer>();
list.add(1);
list.add(2);
list2.add(1);
list2.add(2);
list2.add(3);
list2.add(4);
for (int i = 0; i < list.size(); i++)
for (int j = 0; j < list2.size(); j++)
if(list.get(i)==list2.get(j)||list.get(i).equals(list2.get(j)))
list3.add(list.get(i));



for (int i = 0; i < list3.size(); i++)
System.out.println(list3.get(i));




参考技术C

package java6;

import java.util.*;

public class Test7_4

public static void main(String[] args)

// TODO Auto-generated method stub

Integer[] A = 1,2,3,4;

Integer[] B = 1,3,7,9,11;

List<Integer> listA = Arrays.asList(A);

List<Integer> listB = Arrays.asList(B);

List<Integer> jiaoji = new ArrayList<Integer>();

for(Integer a:listA)

if(listB.contains(a))

jiaoji.add(a);

System.out.println(jiaoji);

List<Integer> bingji = new ArrayList<Integer>();

for(Integer a:listA)

if(!bingji.contains(a))

bingji.add(a);

for(Integer b:listB)

if(!bingji.contains(b))

bingji.add(b);


参考技术D 什么意思,你都把思路写出来了啊

java求交集和并集

用一个集合类求集合a和b的交集与并集。大体框架如下:
public class Group
int a[]=new int[20];
int b[]=new int[20];
……
public void jiaoji(...)
for(i=0;i<a.length;i++)
for(j=0;j<b.length;j++)
if(a[i]==b[j]) System.out.print(a[i]+",");

public void bingji()……
public static void main(String[] args)
int a[]=1,2,3,4,5;
int b[]=4,5,6,7,8;
System.out.print("交集为");
……
System.out.print("并集为");
……


因为刚学java几个月,只会最简单的,不要在前面加import或package语句,也不要用set语句,只用简单的for循环(例如jiaoji里的程序)。请帮我补充完整个程序,并纠正我的错误。谢谢,奖励50~100分哦
我说的集合类,是指编写一个处理集合交并集运算的类,不是指java专门的集合类

虽然想尽量维持你程序的原型,但是还是改的差不多了。学java注重的是面向对象的思想,建议你不要把太多精力放在这些算法上面,不能再像学习C语言那样学习java。

public class Group
public void jiaoji(int[] a,int[] b)
for(int i=0;i<a.length;i++)
for(int j=0;j<b.length;j++)
if(a[i]==b[j])
System.out.print(a[i]+",");




public void bingji(int[] a,int[] b)
for(int i=0;i<a.length;i++)
System.out.print(a[i]+",");

for(int i=0;i<b.length;i++)
boolean flag=true;
for(int j=0;j<a.length;j++)
if(b[i]==a[j])
flag=false;


if(flag)
System.out.print(b[i]+",");



public static void main(String[] args)
int a[]=1,2,3,4,5;
int b[]=4,5,6,7,8;
Group group=new Group();
System.out.print("交集为:");
group.jiaoji(a,b);
System.out.print("\n并集为:");
group.bingji(a,b);

追问

谢谢你的解答,我有几个疑问:
bingji里有个if(flag),C语言可以这么写,但是java允许这么写吗?
还有main里的Group group=new Group(),前面没有这个名为Group的构造方法呀,能用么?
在写int a[]=......之前,不需要int a[]=new int[20]这句话吗?

追答

flag只是定的一个boolean类型的变量当做标记而已,你可以把flag改成任意一个合法的变量名。

因为构造方法是每个类必须有的,所以即使你不写,编译器也会给该类默认一个无参构造方法。

int a[]=........,是一种初始化方式,编译器会自动为数组分配一定的空间,所以不能在前面在写
int a[]=new int[20]。

int a[]=new int[20]是声明数组的同时指定数组的长度为20。这时你只能如下赋值:
a[0]=**;
a[1]=**;
.
.
.a[19]=**;
或者通过一个for循环完成赋值。

你知道下面三楼回复的mark~`是什么意思吗??

追问

mark~`是什么意思?

追答

我问你呢!!

参考技术A 首先,集合类就要import语句,当然,不用import也行;
只要肯动脑,这一点也不难,以后不要偷懒了啊;

public class JiaoBinTest

public static void main(String[] args)
int[]a = 32,45,65,34,213;
int[]b = 32,45,65,23,335;
int[]bin = bin(a,b);
int[]jiao = jiao(a,b);
for(int i=0;i<jiao.length;i++)
System.out.println(jiao[i]);

for(int i=0;i<bin.length;i++)
System.out.println(bin[i]);



public static int[] bin(int[]a,int[]b)
int count = a.length + b.length;
for(int i=0;i<a.length;i++)
for(int j=0;j<b.length;j++)
if(a[i] == b[j])
count --;



int[]bin = new int[count];
count = 0;
for(int i=0;i<a.length;i++)
bin[count ++] = a[i];

boolean same = false;
for(int i=0;i<b.length;i++)
for(int j=0;j<a.length;j++)
if(b[i] == a[j])
same = true;


if(!same)
bin[count++] = b[i];

same = false;

return bin;


public static int[] jiao(int[]a,int[]b)
int count = 0;
for(int i=0;i<a.length;i++)
for(int j=0;j<b.length;j++)
if(a[i] == b[j])
count ++;



int[]jiao = new int[count];
count = 0;
for(int i=0;i<a.length;i++)
for(int j=0;j<b.length;j++)
if(a[i] == b[j])
jiao[count] = a[i];
count ++;



return jiao;

追问

感谢您的解答。只是程序有点繁琐,count是不是稍嫌多余?

追答

没有count怎么知道数组定义多大啊,但你也可以
1:使用arraylist计算,add添加,toarray方法得到对应的数组; 使用hasset计算并集,这样相同的自动会舍弃;
2:使用足够大的数组,使用arraycopy copy到一个较小的数组中去

追问

能不能在一开始就规定好数组的大小?

追答

2.中不是说了吗

参考技术B 虽然想尽量维持你程序的原型,但是还是改的差不多了。学java注重的是面向对象的思想,建议你不要把太多精力放在这些算法上面,不能再像学习C语言那样学习java。

public class Group
public void jiaoji(int[] a,int[] b)
for(int i=0;i<a.length;i++)
for(int j=0;j<b.length;j++)
if(a[i]==b[j])
System.out.print(a[i]+",");




public void bingji(int[] a,int[] b)
for(int i=0;i<a.length;i++)
System.out.print(a[i]+",");

for(int i=0;i<b.length;i++)
boolean flag=true;
for(int j=0;j<a.length;j++)
if(b[i]==a[j])
flag=false;


if(flag)
System.out.print(b[i]+",");



public static void main(String[] args)
int a[]=1,2,3,4,5;
int b[]=4,5,6,7,8;
Group group=new Group();
System.out.print("交集为:");
group.jiaoji(a,b);
System.out.print("\n并集为:");
group.bingji(a,b);

参考技术C import java.util.ArrayList;

public class Group

/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub
Group g=new Group();
String[] a = "a","b","c","d",;
String[] b = "c","d","e","f","g",;
System.out.println("交集是:");
g.doJiaoJi(a, b);
System.out.println("\n并集是:");
g.doBingJi(a, b);



public void doBingJi( String[] a, String[] b)
ArrayList<String> tmp = new ArrayList<String>();
for(String s:b)
tmp.add(s);

for(String s:a)

if(!tmp.contains(s))
tmp.add(s);


String[] c = tmp.toArray(new String[tmp.size()]);
for (String s:c)
System.out.print(s+" ");



public void doJiaoJi( String[] a, String[] b)
ArrayList<String> tmp = new ArrayList<String>();
for(String s:b)
for(String s2:a)
if(s.equals(s2))
tmp.add(s);



String[] c = tmp.toArray(new String[tmp.size()]);
for (String s:c)
System.out.print(s+" ");



参考技术D 处理集合交并集运算的类,实现java专门的集合类
简单实现代码如下:
package test;

import java.util.HashSet;
import java.util.Set;

public class Test

public static void main(String[] args)
Set<Integer> result = new HashSet<Integer>();
Set<Integer> set1 = new HashSet<Integer>()
add(1);
add(3);
add(5);
;

Set<Integer> set2 = new HashSet<Integer>()
add(1);
add(2);
add(3);
;

result.clear();
result.addAll(set1);
result.retainAll(set2);
System.out.println("交集:"+result);

result.clear();
result.addAll(set1);
result.addAll(set2);
System.out.println("并集:"+result);



以上是关于用java编写程序,求集合的并集、交集和差集的主要内容,如果未能解决你的问题,请参考以下文章

ES6数组:两个数组或数组对象取并集、交集、差集

利用sort和uniq求两个文件的并集,交集和差集

请问java有工具类取两个list的并集吗?

asp.net两个数组的并集

java求交集和并集

用linq做数组取并集