2016-10-10 36 views
1

我正在處理數組問題。 我有一個數組 String [] x= {"no", "i", "in" , "eye"}; 我需要創建第二個維度,它可以對每個值中的字符進行計數,並重復N次元素。 N是元素的長度。 例如:如何創建2維數組,排除空值

[no] ->[no][no] 
[i] -> [i] 
[in] ->[in][in] 
[eye] ->[eye][eye][eye]. 

我已經創建了下面的代碼來解決這個問題:

public class targil_2_4 { 
    public static void main(String[] args) { 
    String [] x= {"no", "i", "in" , "eye"}; 
    String [][] y = new String [x.length][];    
    for(int i=0; i<=x.length-1; i++){   
     y[i]= new String [x[i].length()]; 

      for(int j=0; j<i; j++){ 

       for(int b=0; b<=y[i].length-1; b++){ 

        if(x[i] == null){break;} 
        else{ 
      y[i][j]= x[i]; 
        } 

        } 

       System.out.println(x[i]+ " "+Arrays.toString(y[i])); 

       }   
     }  
} 

}

,但我得到類似的值[無] - > [無] [沒有] [null]:

[i] 
[in, null] 
[in, in] 
[eye, null, null] 
[eye, eye, null] 
[eye, eye, eye] 

如何消除具有「空值」或其他方式來解決此問題的行LEM?

+1

爲什麼使用'x [i] .length()'作爲數組長度,但循環'i'次? –

+0

@JonSkeet OP想要創建等於給定字符串長度的副本 –

+4

提示:您希望我們花時間幫助您。所以你請花1分鐘來正確地格式化/縮進你的源代碼。一個事實是,你的代碼很難閱讀,所以我們花費的時間比它應該多。而且您知道:如果您要以更具可讀性的方式寫下代碼,那麼您也可以更快地找到代碼中的錯誤! – GhostCat

回答

2

你可以試試這個解決方案。你只需做以下事情:

  1. 迭代的X每個條目。
  2. 創建長度等於元素的長度的陣列(y [i]x [i]。所以你可以重複這個元素x [i] N次。其中N是x [i]的長度。陣列的
  3. 對於每個條目(值Y [i] [j]的)(值Y [i]),將該值設置爲X [I]

請參考評論中的編號以便更好地理解。

public static void main(String[] args) 
    { 
     String[] x = {"no", "i", "in", "eye"}; 
     String[][] y = new String[x.length][]; 
     for (int i = 0; i <= x.length - 1; i++) //1 
     { 
      y[i] = new String[x[i].length()]; //2 

      for (int j = 0; j < y[i].length; ++j) 
      { 
       y[i][j] = x[i]; //3 
      } 
      System.out.println(Arrays.toString(y[i])); 
     } 
    } 
+1

請嘗試解釋爲什麼這是一個更好的解決方案,這是一個新手嘗試要學習,給他一些代碼不會幫他 – AxelH

+0

Tnx,這是非常明確和簡單的做法。 –

0

你得到空值,因爲在這一行你檢查他們什麼也不做

如果(X [I] == NULL){打破;}

如果你想消除空,只是做而不是打破

+0

其實,這不是他的問題。 – GhostCat

2

您是過於複雜事情:

for(int i=0; i<=x.length-1; i++) { // to iterate over the content of x 
    y[i]= new String [x[i].length()]; 
    for(int j=0; j<x[i].length(); j++) { // iterate over the new array 
    y[i][j]= x[i];  // and for each position in that array: fetch corresponding value from input array x 
    } 
} 

應該這樣做。

你看,你的輸入數組不包含任何的空值。所以你只需迭代該數組;並且對於該陣列中的每個條目E,您確定的長度爲E;然後創建E的「長度」副本。

並記錄:你不需要我們來解決這些問題。你可以很容易地在調試器中運行你的代碼來判斷髮生了什麼;或添加打印語句以瞭解它在運行時發生了什麼!

+0

如果我可能會建議在每個循環的內容上添加一些註釋(或者添加一個指向您的解釋的數字)。 – AxelH

+1

@AxelH是這樣做的。儘管(imho),代碼片段下方的文本應該很好地解釋代碼正在做什麼。 – GhostCat

1

試試這個。

String [] x= {"no", "i", "in" , "eye"}; 
    String[][] y = Stream.of(x) 
     .map(s -> IntStream.range(0, s.length()) 
      .mapToObj(i -> s).toArray(String[]::new)) 
     .toArray(String[][]::new); 
    for (String[] a : y) 
     System.out.println(Arrays.toString(a)); 

結果:

[no, no] 
[i] 
[in, in] 
[eye, eye, eye] 
+4

太好了。投擲一個複雜的4線流操作,無法迭代/設置數組使用簡單** for循環** ... – GhostCat