一般测试
答案提供了几种解决方案,因此我决定找出最有效的一种。
解决方案
- HashSet基于
Óscar López
- 基于流的
Bilesh Ganguly
- Foreach基于
Ruchira Gayan Ranaweera
- HashMap基于
ikarayel
我们有什么
String
包含 50% 的公共元素的两个数组。
- 每个数组中的每个元素都是唯一的,因此没有重复项
测试代码
public static void startTest(String name, Runnable test){
long start = System.nanoTime();
test.run();
long end = System.nanoTime();
System.out.println(name + ": " + (end - start) / 1000000. + " ms");
}
随着使用:
startTest("HashMap", () -> intersectHashMap(arr1, arr2));
startTest("HashSet", () -> intersectHashSet(arr1, arr2));
startTest("Foreach", () -> intersectForeach(arr1, arr2));
startTest("Stream ", () -> intersectStream(arr1, arr2));
解决方案代码:
哈希集
public static String[] intersectHashSet(String[] arr1, String[] arr2){
HashSet<String> set = new HashSet<>(Arrays.asList(arr1));
set.retainAll(Arrays.asList(arr2));
return set.toArray(new String[0]);
}
溪流
public static String[] intersectStream(String[] arr1, String[] arr2){
return Arrays.stream(arr1)
.distinct()
.filter(x -> Arrays.asList(arr2).contains(x))
.toArray(String[]::new);
}
前锋
public static String[] intersectForeach(String[] arr1, String[] arr2){
ArrayList<String> result = new ArrayList<>();
for(int i = 0; i < arr1.length; i++){
for(int r = 0; r < arr2.length; r++){
if(arr1[i].equals(arr2[r]))
result.add(arr1[i]);
}
}
return result.toArray(new String[0]);
}
哈希映射
public static String[] intersectHashMap(String[] arr1, String[] arr2){
HashMap<String, Integer> map = new HashMap<>();
for (int i = 0; i < arr1.length; i++)
map.put(arr1[i], 1);
ArrayList<String> result = new ArrayList<>();
for(int i = 0; i < arr2.length; i++)
if(map.containsKey(arr2[i]))
result.add(arr2[i]);
return result.toArray(new String[0]);
}
测试过程
让我们看看如果我们给方法一个20
元素数组会发生什么:
HashMap: 0.105 ms
HashSet: 0.2185 ms
Foreach: 0.041 ms
Stream : 7.3629 ms
正如我们所见,Foreach方法做得最好。但是Stream方法几乎慢了 180 倍。
让我们继续使用500
元素进行测试:
HashMap: 0.7147 ms
HashSet: 4.882 ms
Foreach: 7.8314 ms
Stream : 10.6681 ms
在这种情况下,结果发生了巨大变化。现在最有效的是HashMap方法。
下一个10 000
元素测试:
HashMap: 4.875 ms
HashSet: 316.2864 ms
Foreach: 505.6547 ms
Stream : 292.6572 ms
最快的还是HashMap方法。而且Foreach方法变得相当缓慢。
结果
如果有 < 50 个元素,那么最好使用该Foreach
方法。他在这一类别中的速度非常出色。
在这种情况下,最好的顶部将如下所示:
Foreach
HashMap
HashSet
Stream
- 最好不要在这种情况下使用
但是,如果您需要处理大数据,那么最好的选择是使用HashMap
基于方法。
所以最好的顶部看起来像这样:
HashMap
HashSet
Stream
Foreach