想象一下,我们有两个数组:
String[] arr1 = {"a", "b"};
String[] arr2 = {"1", "2", "3"};
获得包含两者的相乘值的第三个String数组的更好方法是什么。像:
String[] arr3 = {"a1", "a2", "a3", "b1", "b2", "b3"};
我知道,我可以使用循环并连接1中的每个元素,每个元素来自2,并将结果放在3中。但实际上arr1
和arr2
中有更多元素。 Java中是否有一种特殊的工具可以提高效率?
答案 0 :(得分:5)
如果你可以使用Java 8,这是一个单行:
public static void main(String[] args) {
String[] arr1 = {"a", "b"};
String[] arr2 = {"1", "2", "3"};
String[] result = Arrays.stream(arr1).flatMap(s1 -> Arrays.stream(arr2).map(s2 -> s1 + s2)).toArray(String[]::new);
System.out.println(Arrays.toString(result));
}
逻辑是第一个数组的每个元素都映射到该元素前置的第二个数组的所有元素的Stream。然后将此流展平并收集到阵列中。
否则,虽然您没有发布您当前拥有的代码,但这听起来是一种很好的方法,并且Java中没有任何神奇的方法可以简化它。
答案 1 :(得分:1)
int z = 0;
String[] suit_arr = {"C", "D", "H", "S"};
String[] rank_arr = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
String[] pack = new String[52];
for (int i = 0; i < suit_arr.length; i++) {
for (int j = 0; j < rank_arr.length; j++) {
pack[z] = suit_arr[i] + rank_arr[j];
z++;
}
}
for (int y = 0; y < pack.length; y++) {
System.out.println(pack[y]);
}
}
这是卡包。 所以它不仅仅是连接它就像我必须在数组的每个元素之间得到所有可能的混合。 P.S。:by by,为什么我得到了这个问题的弊端?是愚蠢的问题还是什么?
答案 2 :(得分:0)
如果你的意思是渐近复杂意义上的“有效”,那么没有比嵌套循环更有效的方法。无论如何,您需要生成并记录对arr1.length * arr2.length
字符串的引用,并且在最佳情况下需要与元素数量成比例的工作;也就是说,它是o(arr1.length * arr2.length)
。嵌套循环方法已经表现出最佳的案例复杂性。
然而,您也可以使用Java 8流来解决问题,这可以更紧凑地表达(对某些人来说)更清晰。这也提供了并行化操作的入口,因此虽然它没有降低渐近复杂度(并且它可能具有稍高的总体成本),但如果你的意思是“有效”,那么在更短的时间内,那么流可能就是你的本意寻找。另一个答案已经提供了详细信息。