问题如右:有两个字符串数组a和b,寻找相同元素 (a和b都比较大)

[color=blue][color=cyan][/color][b]Java代码
package com.test.javaeye;

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

/**
* 题目:有两个字符串数组a和b,寻找相同元素
*
*/
public class Test1 {

public static void main(String[] args) {

String[] strArr1 = {"xiaoxin","niutou","shanqiu","luobo" };
String[] strArr2 = {"xiaoxin","ggg","shanqiu","meile","dddsf","niutou"};

List<String> list = getAllSameElement2(strArr1,strArr2);
if(list == null) {
System.out.println("没有相同的元素");
System.exit(0);
}
for(String s:list) {
System.out.println(s);
}
}

/**
* 比较简洁的方法,但明显不是面试官想要的答案,因为题目后面标注了'两个数组都<br>
* 很大的说明'.
*
* @param strArr1
* @param strArr2
* @return
*/
public static List<String> getAllSameElement1(String[] strArr1,String[] strArr2) {
if(strArr1 == null || strArr2 == null) {
return null;
}
List<String> strList1 = new ArrayList<String>(Arrays.asList(strArr1)); //----------代码段1
List<String> strList2 = new ArrayList<String>(Arrays.asList(strArr2)); //--------------代码段2

strList1.retainAll(strList2);
return strList1;
}

/**
* 由于最近看见一文章,是描述数据库mergeJoin 的扫描方式的,仿照里面的大致逻辑自己写了<br>
* 个类似的方法。如果数组大的话,这个要比getAllSameElement1好
*
* 大致思路是:1.首先将两个数组A、B排序(递增)<br>
* 2.分别从A和B中各取出一元素a,b,对a和b进行比较:<br>
* 1)如果a与b相等,则将a或b存入一指定集合中<br>
* 2)如果a小于b,则继续取A的下一元素,再与b比较<br>
* 3)如果a大于b,则取B的下一个元素,与a进行比较<br>
* 3.反复进行步骤2,知道A或B的元素都比较完<br>
* 4.返回集合(存了相同的元素)<br>
* @param strArr1
* @param strArr2
* @return
*/
public static List<String> getAllSameElement2(String[] strArr1,String[] strArr2) {
if(strArr1 == null || strArr2 == null) {
return null;
}
Arrays.sort(strArr1);
Arrays.sort(strArr2);

List<String> list = new ArrayList<String>();

int k = 0;
int j = 0;
while(k<strArr1.length && j<strArr2.length) {
if(strArr1[k].compareTo(strArr2[j])==0) {
if(strArr1[k].equals(strArr2[j]) ) {
list.add(strArr1[k]);
k++;
j++;
}
continue;
} else if(strArr1[k].compareTo(strArr2[j])<0){
k++;
} else {
j++;
}
}
return list;
}
}

package com.test.javaeye;

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

/**
* 题目:有两个字符串数组a和b,寻找相同元素
*
*/
public class Test1 {

public static void main(String[] args) {

String[] strArr1 = {"xiaoxin","niutou","shanqiu","luobo" };
String[] strArr2 = {"xiaoxin","ggg","shanqiu","meile","dddsf","niutou"};

List<String> list = getAllSameElement2(strArr1,strArr2);
if(list == null) {
System.out.println("没有相同的元素");
System.exit(0);
}
for(String s:list) {
System.out.println(s);
}
}

/**
* 比较简洁的方法,但明显不是面试官想要的答案,因为题目后面标注了'两个数组都<br>
* 很大的说明'.
*
* @param strArr1
* @param strArr2
* @return
*/
public static List<String> getAllSameElement1(String[] strArr1,String[] strArr2) {
if(strArr1 == null || strArr2 == null) {
return null;
}
List<String> strList1 = new ArrayList<String>(Arrays.asList(strArr1)); //----------代码段1
List<String> strList2 = new ArrayList<String>(Arrays.asList(strArr2)); //--------------代码段2

strList1.retainAll(strList2);
return strList1;
}

/**
* 由于最近看见一文章,是描述数据库mergeJoin 的扫描方式的,仿照里面的大致逻辑自己写了<br>
* 个类似的方法。如果数组大的话,这个要比getAllSameElement1好
*
* 大致思路是:1.首先将两个数组A、B排序(递增)<br>
* 2.分别从A和B中各取出一元素a,b,对a和b进行比较:<br>
* 1)如果a与b相等,则将a或b存入一指定集合中<br>
* 2)如果a小于b,则继续取A的下一元素,再与b比较<br>
* 3)如果a大于b,则取B的下一个元素,与a进行比较<br>
* 3.反复进行步骤2,知道A或B的元素都比较完<br>
* 4.返回集合(存了相同的元素)<br>
* @param strArr1
* @param strArr2
* @return
*/
public static List<String> getAllSameElement2(String[] strArr1,String[] strArr2) {
if(strArr1 == null || strArr2 == null) {
return null;
}
Arrays.sort(strArr1);
Arrays.sort(strArr2);

List<String> list = new ArrayList<String>();

int k = 0;
int j = 0;
while(k<strArr1.length && j<strArr2.length) {
if(strArr1[k].compareTo(strArr2[j])==0) {
if(strArr1[k].equals(strArr2[j]) ) {
list.add(strArr1[k]);
k++;
j++;
}
continue;
} else if(strArr1[k].compareTo(strArr2[j])<0){
k++;
} else {
j++;
}
}
return list;
}
}


说明: 1. 知道代码段1和代码段2为什么要 写成 List<String> strList1 = new ArrayList<String>(Arrays.asList(strArr1)); ,而不是List<String> strList1 = Arrays.asList(strArr1); 吗?你可以测试下,可能会让你产生一种继续探索Arrays类的欲望。
2.如果你有好的方法,请务必和大家共享啊,共同学习共同进步

因为:Arrays.asList 返回的是只读的List对象

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

网友想出来的其他方法:

public static void main(String[] args) {
// String[] strArr1 = { "xiaoxin", "niutou", "shanqiu", "luobo" };
// String[] strArr2 = { "xiaoxin", "ggg", "shanqiu", "meile", "dddsf", "niutou" };
String[] strArr1 = { "xiaoxin", "niutou", "shanqiu" };
String[] strArr2 = { "ggg", "shanqiu", "meile", "dddsf", "niutou", "luobo" };
int max = strArr1.length > strArr2.length ? strArr1.length : strArr2.length;
int[][] ary = new int[max * 4][];
for (int i = 0; i < strArr1.length; i++) {
int hash = hash(strArr1[i].hashCode());
int index = indexFor(hash, max * 4);
if (ary[index] == null) {
ary[index] = new int[1];
} else {
ary[index] = Arrays.copyOf(ary[index], ary[index].length * 2);
}
for (int j = 0; j < ary[index].length; j++) {
if (ary[index][j] == 0) {
ary[index][j] = hash;
}
}
}
for (int i = 0; i < strArr2.length; i++) {
int hash = hash(strArr2[i].hashCode());
int index = indexFor(hash, max * 4);
if (ary[index] != null) {
for (int j = 0; j < ary[index].length; j++) {
if (ary[index][j] == hash) {
System.out.println(strArr2[i]);
}
}
}
}
}

static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}

static int indexFor(int h, int length) {
return h & (length - 1);
}
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

public static Set<String> getAllSameElement3(String[] strArr1,
String[] strArr2) {
if (strArr1 == null || strArr2 == null) {
return null;
}
List<String> list1 = new ArrayList<String>(Arrays.asList(strArr1));
Set<String> set1 = new HashSet<String>(list1);
set1.retainAll(Arrays.asList(strArr2)); return set1;
}

//retainAll方法 HashSet中最高效


[color=olive][/color] [color=cyan][/color][b][/b][/b][/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值