用最少循环求两个数组的交集、差集、并集

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
* 用最少循环求两个数组的交集、差集、并集
*
* @author ZQC
*
*/
public class Test
{

public static void main(String[] args)
{
Integer[] m = { 1, 2, 3, 4, 5 };
Integer[] n = { 3, 4, 6 };

System.out.println("----------并集------------");
Integer[] b = getB(m, n);
for (Integer i : b)
{
System.out.println(i);
}

System.out.println("----------交集------------");
Integer[] j = getJ(m, n);
for (Integer i : j)
{
System.out.println(i);
}

System.out.println("----------差集------------");
Integer[] c = getC(m, n);
for (Integer i : c)
{
System.out.println(i);
}
}

/**
* 求并集
*
* @param m
* @param n
* @return
*/
private static Integer[] getB(Integer[] m, Integer[] n)
{
// 将数组转换为set集合
Set<Integer> set1 = new HashSet<Integer>(Arrays.asList(m));
Set<Integer> set2 = new HashSet<Integer>(Arrays.asList(n));

// 合并两个集合
set1.addAll(set2);

Integer[] arr = {};
return set1.toArray(arr);
}

/**
* 求交集
*
* @param m
* @param n
* @return
*/
private static Integer[] getJ(Integer[] m, Integer[] n)
{
List<Integer> rs = new ArrayList<Integer>();

// 将较长的数组转换为set
Set<Integer> set = new HashSet<Integer>(Arrays.asList(m.length > n.length ? m : n));

// 遍历较短的数组,实现最少循环
for (Integer i : m.length > n.length ? n : m)
{
if (set.contains(i))
{
rs.add(i);
}
}

Integer[] arr = {};
return rs.toArray(arr);
}

/**
* 求差集
*
* @param m
* @param n
* @return
*/
private static Integer[] getC(Integer[] m, Integer[] n)
{
// 将较长的数组转换为set
Set<Integer> set = new HashSet<Integer>(Arrays.asList(m.length > n.length ? m : n));

// 遍历较短的数组,实现最少循环
for (Integer i : m.length > n.length ? n : m)
{
// 如果集合里有相同的就删掉,如果没有就将值添加到集合
if (set.contains(i))
{
set.remove(i);
} else
{
set.add(i);
}
}

Integer[] arr = {};
return set.toArray(arr);
}

}

posted @ 2019-05-23 17:11  随风飞起-英  阅读(673)  评论(0编辑  收藏  举报