首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java面试 >

数组遍历去反复

2013-09-06 
数组遍历去重复两个数组比较相同的,最后想得到三个数组,一个是两个数组相同的数组成的,另外两个分别是原来

数组遍历去重复
两个数组比较相同的,最后想得到三个数组,一个是两个数组相同的数组成的,另外两个分别是原来两个数组去除相同后的!
 原数组:
        String[]  array1 = {1,2,3,4}
       String[]  array2 = {3,4,5,6,7}
 需要得到的数组:
      int [] a1 = {3,4}
     int [] a2 = {1,2}
     int [] a3 = {5,6,7}

求哪位大侠算法比较好的,帮忙写一下!3Q3Q~~数组遍历去反复数组遍历去反复
       数组 算法
[解决办法]
为什么不自己试着写写呢 这个很简单呢
别人写给你  你只是被动接受 下次还是不会
自己试着写下 再遇到也会写
[解决办法]
先把这两个数组转为 java.util.Set, 然后做 retainAll() 可得到交集, 做 removeAll() 可得到减集
[解决办法]

引用:
先把这两个数组转为 java.util.Set, 然后做 retainAll() 可得到交集, 做 removeAll() 可得到减集
顶这个,很省事
[解决办法]
http://blog.csdn.net/lzwjavaphp/article/details/6998453
[解决办法]
C# 里面有专门的函数实现 列举其中一个差集
C# 的这个方法是System.Linq下的

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集合就是一个并集

数组遍历去反复能力有限,疏漏之处望见谅!

[解决办法]
数组遍历去反复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;
}

}


[解决办法]
数组遍历去反复

热点排行