23,407
社区成员
发帖
与我相关
我的任务
分享

public class CompareArray {
public static void main(String[] args) {
new CompareArray().inti();
}
private void inti() {
int[] Aarray={1,2,3,4};
int[] Barray={3,4,5,6,7};
int[] ddd = andOperation(Aarray, Barray);// 交集
int[] ad = XOROperation(Aarray, ddd);//差集
int[] bd = XOROperation(Barray, ddd);
printArray(ddd);
printArray(ad);
printArray(bd);
}
private int[] andOperation(int[] a, int[] b){
int[] andArray = new int[Math.max(a.length, b.length)];
a = sortArray(a);
b = sortArray(b);
int cursorA=0, cursorB=0, count=0;
while(cursorA<a.length && cursorB<b.length){
if(a[cursorA] == b[cursorB]){
andArray[count] = a[cursorA];
count++;cursorA++;cursorB++;
}else if(a[cursorA] > b[cursorB])
cursorB++;
else
cursorA++;
}
return trimArray(andArray);
}
private int[] XOROperation(int[] a, int[] b){
int[] XORArray = new int[Math.max(a.length, b.length)];
a = sortArray(a);
b = sortArray(b);
int cursorA=0, cursorB=0, count=0;
while(a.length>cursorA && b.length>cursorB){
if(a[cursorA] == b[cursorB]){
cursorB++;cursorA++;
}else if(a[cursorA] > b[cursorB]){
XORArray[count] = b[cursorB];
cursorB++;count++;
}
else {
XORArray[count] = a[cursorA];
cursorA++;count++;
}
}
if(cursorA==a.length && cursorB == b.length){}
else if(cursorA<a.length){
for(int i = cursorA; i<a.length ;i++){
XORArray[count] = a[i];
count++;
}
}else{
for(int i = cursorB; i<b.length ;i++){
XORArray[count] = b[i];
count++;
}
}
return trimArray(XORArray);
}
private int[] sortArray(int[] datas){
for(int i=1; i<datas.length; i++) {
for(int j=0; j<datas.length-i; j++) {
if(datas[j] > datas[j+1]) {
int temp = datas[j];
datas[j] = datas[j+1];
datas[j+1] = temp;
}
}
}
return datas;
}
private int[] trimArray(int[] array){
int count = 0;
for(int i : array){
if(i == 0)
count++;
}
int[] newArray = new int[array.length -count];
count =0;
for(int i : array){
if(i!=0){
newArray[count] = i;
count++;
}
}
return newArray;
}
private void printArray(int[] array){
System.out.println();
boolean notFirst = false;
for(int i:array){
if(i==0 && notFirst)
return;
System.out.print(i+" ");
notFirst = true;
}
}
}

LZ 我写了个,不用API的,就是看着恶心点,都是自己的逻辑了。
package com.csdn.fzw;
public class From_web {
/**
* @param args
*/
public static void main(String[] args) {
String[] arr1 = {"1","2","3","4"};//"3","4","5","6","3"
String[] arr2 = {"3","4","5","6","7"};//"1","2","3"
String[] arrMerger = mergerArray(arr1,arr2);
String[] arrRr = removeRepeat(arrMerger, arrMerger);
System.out.println("并集:");
for(String str : arrRr){
System.out.print(str + " ");
}
System.out.println();
String[] intersect = changeToArray(sbIntersect);
System.out.println("交集:");
for(String str : intersect){
System.out.print(str + " ");
}
System.out.println();
String[] ds_1 = dSet(intersect,arr1);
System.out.println("差集:");
for(String str:ds_1){
if(ds_1.length > 0){
System.out.print(str+" ");
}
}
System.out.println();
String[] ds_2 = dSet(intersect,arr2);
System.out.println("差集:");
for(String str:ds_2){
if(ds_1.length > 0){
System.out.print(str+" ");
}
}
}
private static StringBuffer sbIntersect = new StringBuffer();
/**
* 合并数组
* @param arrOne
* @param arrTwo
* @return
*/
public static String[] mergerArray(String[] arrOne,String[] arrTwo){
String[] marray = new String[arrOne.length + arrTwo.length];
//拷贝第一个数组
for(int i = 0; i < arrOne.length; i ++){
marray[i] = arrOne[i];
}
//拷贝第二个数组
for(int i = arrOne.length,index = 0; i < arrOne.length + arrTwo.length; i++,index ++){
marray[i] = arrTwo[index];
}
return marray;
}
/**
* 去重函数
* @param arrOne
* @param arrTwo
* @return
*/
public static String[] removeRepeat(String[] arrOne,String[] arrTwo){
StringBuffer sbSave = new StringBuffer();
//统计匹配次数
int countNum = 0;
String strBuffer = "";
for(int i = 0; i < arrOne.length; i ++){
for(int j = 0; j < arrTwo.length; j ++){
if(arrOne[i] == arrTwo[j]){
countNum ++;
}
}
if(countNum > 1){
strBuffer = arrOne[i];
if(null != arrOne[i]){
sbSave.append(arrOne[i]);
//相交的另外保存
intersect(arrOne[i]);
}
for(int ri = 0; ri < arrOne.length; ri ++){
if(strBuffer == arrOne[ri]){
arrOne[ri] = null;
}
}
}else{
if(null != arrOne[i]){
sbSave.append(arrOne[i]);
}
}
countNum = 0;
}
String[] arrNew = new String[sbSave.length()];
//转成数组
for(int i = 0; i < sbSave.length();i ++){
arrNew[i] = String.valueOf(sbSave.charAt(i));
}
return arrNew;
}
public static String[] dSet(String[] arrOne,String[] arrTwo){
StringBuffer sbSave = new StringBuffer();
String strBuffer = "";
if(arrOne.length >= arrTwo.length){
for(int i = 0; i < arrTwo.length; i ++){
for(int j = 0; j < arrOne.length; j ++){
if(arrTwo[i].equals(arrOne[j])){
strBuffer = arrTwo[i];
for(int ri = 0; ri < arrOne.length; ri ++){
if(strBuffer.equals(arrOne[ri])){
arrOne[ri] = null;
}
}
}
}
}
}else{
for(int i = 0; i < arrOne.length; i ++){
for(int j = 0; j < arrTwo.length; j ++){
if(arrOne[i].equals(arrTwo[j])){
strBuffer = arrOne[i];
for(int ri = 0; ri < arrTwo.length; ri ++){
if(strBuffer.equals(arrTwo[ri])){
arrTwo[ri] = null;
}
}
}
}
}
}
for(int i = 0; i < arrTwo.length; i ++){
if(arrTwo[i] != null){
sbSave.append(arrTwo[i]);
}
}
sbSave.trimToSize();
String[] strArr = new String[sbSave.length()];
for(int i = 0; i < sbSave.length(); i ++){
strArr[i] = String.valueOf(sbSave.charAt(i));
}
return strArr;
}
/**
* 相交函数
* @param str
*/
public static void intersect(String str){
sbIntersect.append(str);
}
/**
* 字符串转数组
* @param sbArray
* @return
*/
public static String[] changeToArray(StringBuffer sbArray){
String[] arr = new String[sbArray.length()];
for(int i = 0; i < sbArray.length(); i ++){
arr[i] = String.valueOf(sbArray.charAt(i));
}
return arr;
}
}
double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };
IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);
foreach (double number in onlyInFirstSet)
Console.WriteLine(number);
/*
This code produces the following output:
2
2.1
2.3
2.4
2.5
*/
java 里面需要自己实现 当然java里面java8已经有lambad了,另外java里面要用Linq需要另外引包
java 里的Linq http://www.infoq.com/cn/news/2007/09/quaere-linq
java 里的lambadhttp://www.oschina.net/question/12_59047
java 里面的 【retainAll() 可得到交集, 做 removeAll() 可得到减集】这个二楼的很正确
自己实现的思路有1(这种方法还很多至列举一个):
1、并集,两层for循环,第一个里面取值在第二个里面比较出现次数一次以上的取第一个值放到新数组里,否则取第二个里面的值放到新数组里
2、交集,两层for循环,第一个里面取的值在第二层里面出现次数大于一次的,这样的存到新数组里
3、差集,两层for循环,第一个里面取的值在第二层里面出现次数小于一次的,这样的存到新数组里
自己实现的思路有2:
都转成集合,之后用jdk提供的方法
1、retainAll
boolean retainAll(Collection<?> c)仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。换句话说,移除此 set 中所有未包含在指定 collection 中的元素。如果指定的 collection 也是一个 set,则此操作会实际修改此 set,这样其值是两个 set 的一个交集。
2、removeAll
boolean removeAll(Collection<?> c)移除 set 中那些包含在指定 collection 中的元素(可选操作)。如果指定的 collection 也是一个 set,则此操作会实际修改此 set,这样其值是两个 set 的一个不对称差集。
3、set集合是一种无需不可重复的集合,你只要把两个数组里面的数都转成集合放进去,那么现在的这个set集合就是一个并集
能力有限,疏漏之处望见谅!

先把这两个数组转为 java.util.Set, 然后做 retainAll() 可得到交集, 做 removeAll() 可得到减集
大侠,能不能用for 写一个吖!3Q3Q~~~为什么不自己试着写写呢 这个很简单呢 别人写给你 你只是被动接受 下次还是不会 自己试着写下 再遇到也会写
自己写了一个,感觉太繁琐了,想听听大侠们有没有好的散法,学习学习!先把这两个数组转为 java.util.Set, 然后做 retainAll() 可得到交集, 做 removeAll() 可得到减集