2015-12-17 29 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流的問題,這可以更加簡潔地表達(對某些人來說)。這也提供了並行化操作的入口,所以儘管它不會降低漸近複雜性(並且其可能具有稍高的總體成本),但如果您的意思是「有效」,那麼壁時間較少,那麼流可能就是您尋找。另一個答案已經提供細節。

相關問題