2015-12-17 30 views
-5

试想一下,我们有两个数组:乘两个数组,并把结果在第三个java的

String[] arr1 = {"a", "b"}; 
String[] arr2 = {"1", "2", "3"}; 

有什么更好的方式来获取包含两者的乘积值第三String数组。像:

String[] arr3 = {"a1", "a2", "a3", "b1", "b2", "b3"}; 

我知道,我可以使用周期,从1各2串连每一个元素,并把结果在3但实际上也有在arr1arr2更多的元素。 Java中是否有一种特殊的工具可以使它更高效?

+2

发布您迄今为止的代码。你在使用Java 8吗? – Tunaki

+0

http://stackoverflow.com/questions/32631602/cartesian-product-of-streams-in-java-8-as-stream-using-streams-你可能会觉得这很有用。但是,您需要将数组来回转换。 –

+0

http://stackoverflow.com/questions/14017779/how-to-concat-2-arraylists没有更好的方式,据我所知 – cutzero

回答

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)); 
} 

的逻辑是,所述第一阵列中的每个元素被映射到由前缀的所述第二阵列的所有元素流这个元素。这个流然后变平并收集到一个数组中。否则,尽管你没有发布你现在拥有的代码,但这听起来像是一种很好的方法,Java中没有任何魔术方法可以简化它。

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 .:由此,为什么我有这个问题的缺点?这是愚蠢的问题还是什么?

+1

这是你现在的代码?如果是这样,您应该将其发布在您的问题中。 – Tunaki

+0

是的。我现在拥有它,并没有提出任何问题。我写了它,例如。但我明白了!为了让顾问能够更好地理解问题,请张贴代码。我对吗? –

+0

是的。它还表明你试图做一些事情,通过为回答者提供一个基础代码来使自己更好,从而使问题更好。如果我猜测,这可能是为什么你的问题是downvoted(缺乏显示现有的代码)。 – Tunaki

0

如果您的意思是渐近复杂性意义上的“高效”,那么没有比嵌套循环更高效的方法。无论如何,您需要生成并记录对arr1.length * arr2.length字符串的引用,并且在最佳情况下需要与元素数成比例的工作;那就是,它是o(arr1.length * arr2.length)。嵌套循环方法已经表现出最佳的复杂性。

但是,您也可以解决Java 8流的问题,这可以更加简洁地表达(对某些人来说)。这也提供了并行化操作的入口,所以尽管它不会降低渐近复杂性(并且其可能具有稍高的总体成本),但如果您的意思是“有效”,那么壁时间较少,那么流可能就是您寻找。另一个答案已经提供细节。

相关问题