[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]
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]