2016-11-30 6 views
5

ピラミッド型の文字の配列を印刷する必要があります。文字からピラミッドパターンを印刷する

char[] chars = {'F', 'E', 'L', 'I', 'Z', ' ', 'A', 'N','I', 'V', 'E', 'R', 'S', 'A', 'R', 'I', 'O'}; 
    int length = chars.length; 


    for (int i = 1; i < length; i += 2) { 
    for (int j = 0; j < 9 - i/2; j++) 
    System.out.print(" "); 

    for (int j = 0; j < i; j++) 
    System.out.print(chars[j]); 

    System.out.print("\n"); 
} 
    for (int i = length; i > 0; i -= 2) { 
    for (int j = 0; j < 9 - i/2; j++) 
    System.out.print(" "); 

    for (int j = 0; j < i; j++) 
    System.out.print(chars[j]); 

    System.out.print("\n"); 

、それは、この印刷します:私はこれまで持っていることはこれです

  F 
      FEL 
     FELIZ 
     FELIZ A 
     FELIZ ANI 
     FELIZ ANIVE 
    FELIZ ANIVERS 
    FELIZ ANIVERSAR 
    FELIZ ANIVERSARIO 
    FELIZ ANIVERSAR 
    FELIZ ANIVERS 
     FELIZ ANIVE 
     FELIZ ANI 
     FELIZ A 
     FELIZ 
      FEL 
      F 

しかし、私はそれは、配列の中央に文字から印刷を開始する必要があります。最終結果は次のようになります。

     I 
         NIV 
        ANIVE 
        ANIVER 
        Z ANIVERS 
        IZ ANIVERSA 
       LIZ ANIVERSAR 
       ELIZ ANIVERSARI 
       FELIZ ANIVERSARIO 
       ELIZ ANIVERSARI 
       LIZ ANIVERSAR 
        IZ ANIVERSA 
        Z ANIVERS 
        ANIVER 
        ANIVE 
         NIV 
         I 

ご協力いただければ幸いです。

+0

はたぶんループ各行2D配列を使用して別のアプローチであるが、それは中間セグメントにない場合はスペースを印刷します表示するには? – qxz

+0

中間インデックスは、最初は 'midStart'と' midEnd'に同じ値が格納されています。その後、 'midStart'をインクリメントし、' midEnd'を減らします。 – raymelfrancisco

答えて

5

以下のコードでも同じことができます。より少ないループ数を使用します。コードのインラインコメントを追加しました。ここで

char[] chars = { 'F', 'E', 'L', 'I', 'Z', ' ', 'A', 'N', 'I', 'V', 'E', 'R', 'S', 'A', 'R', 'I', 'O' }; 
    int length = chars.length; 


    for (int line=0;line<=length;line++) { 
     //This will print upper part of pyramid 
     if(line < length/2){ 
      String output=""; 
      int middelVal=length/2; 
      for (int i = middelVal - line; i > 0; i--) { 
       output=output+" "; 
      } 
      for (int i = middelVal - line; i <= middelVal + line; i++) { 
       output=output+chars[i]; 
      } 
      System.out.println(output); 
     }else if(line > length/2){ 
      //This will print lower part of pyramid 
      String output=""; 
      int middelVal=length/2; 
      int nwNum = chars.length-line; 
      for (int i = middelVal - nwNum; i > 0; i--) { 
       output=output+" "; 
      } 
      for (int i = middelVal - nwNum; i <= middelVal + nwNum; i++) { 
       output=output+chars[i]; 
      } 
      System.out.println(output); 
     } 
    } 
2

これは私の頭の上からですが、私が試してみたの一つの方法は次のようになります:

は、アレイ内の私の真ん中の文字のインデックスを検索します。これを 'startIndex'と呼びます。

すべての行について、長さを2で割ります(切り捨て)。これはstartIndexからの開始オフセットで、最初の文字を決定します。

「Z ANIVERS」としている5行目です。それは9の長さです。2で割ると4になります。

chars配列でstartIndexは8(小数点以下は切り捨て)と計算されます。したがって、私は文字配列内のchar 4(startIndex - 4)から多くの文字が必要になるまで印刷を開始する必要があります。

必要な行の長さと開始文字インデックスが分かっている場合、最初の文字が1つの文字列。あなたの上半分は(文字列で結果を構築し、その後、完全な結果をプリントアウトするために一緒にそれらを連結)

下半分と同じであるように見えるので、

最後に、あなたも半分しか作業を行うことができます編集: 私の答えを読んで、あなたは実際には、1から始まるラインの長さを実際に '見つける'必要はありません2毎回増加するが、元の方法は同じままです。

編集2:もし

String sourceString = "FELIZ ANIVERSARIO"; // source of characters 
    String padding = "  "; // used to create the padding offset for each line 

    int middle = sourceString.length()/2; 

    // top and bottom halves of the output 
    String top = ""; 
    String bottom = ""; 

    for(int currentLength = 1; currentLength < sourceString.length(); currentLength += 2){ 
     String linePadding = padding.substring(currentLength/2, padding.length()); 

     // speical case here, in the given example by the post, the 4th line the offset is one less as the I characters do not line up in the middle 
     // 7 is used as the 4th line has a length of 7 
     if(currentLength == 7){ 
      linePadding = linePadding.substring(1, linePadding.length()); 
     } 

     top += linePadding + sourceString.substring(middle - (currentLength/2), middle + (currentLength/2) + 1) +"\n"; 
     bottom = linePadding + sourceString.substring(middle - (currentLength/2), middle + (currentLength/2) + 1) + "\n" + bottom; 
    } 

    System.out.println(top + sourceString +"\n"+ bottom); 

わからない:誰もが自分のコード化されたバージョンを追加している(と答えが受け入れられている)ので

、私も私が言ったことを、次の鉱山を追加することができますこれは意図的なものですが、私はユーザーの例で気づいたループに特別な期待を追加しました.4行目が1でオフになっています(私はそこに並んでいません)。私が整列していて、それがタイプミスであったならば、それが完全にブロックされていればそれを取り除くことができます。

3

中間インデックスを取得すると、2つの変数に格納することで、文字印刷の開始位置と終了位置がマークされます。

int mid = length/2; // left end 
int midLen = mid;  // right end 

ループは、次に文字が右端midLen + 1まで印刷され、左端midまで印刷スペースを開始します。midLenをさらに右に移動し、midをデクリメントしてさらに左に移動します。

for(int i = mid; mid > -1; mid--, midLen++) { 
    for(int s = 0; s < mid; s++) 
     System.out.print(" "); 

    for (int j = mid; j < midLen + 1; j++) { 
     System.out.print(chars[j]); 
    } 
    System.out.print("\n"); 
} 

下ピラミッドを印刷するには、我々はlength0インデックスから始めましょう。今回はさらにmidをインクリメントし、さらに左に行くには、midLenをデクリメントし、行ごとに文字列を途中まで切り捨てます。

mid = 0; 
midLen = length; 

for(int i = mid; midLen != length/2; mid++, midLen--) { 

    for(int s = 0; s < mid; s++) 
     System.out.print(" "); 

    for(int j = mid; j < midLen; j++) { 
     System.out.print(chars[j]); 
    } 
    System.out.print("\n"); 
} 

Test here

BONUS:Java 8's new featuresを活用。同じメカニズム、私はあなたのために検査を残します。

3

は、文字列の各文字の上

char[] chars = { 'F', 'E', 'L', 'I', 'Z', ' ', 'A', 'N', 'I', 'V', 'E', 'R', 'S', 'A', 'R', 'I', 'O' }; 
    int size = chars.length; 
    int mid = size/2 + 1; 
    char[][] matrix = new char[size][size]; 
    for (char[] cs : matrix) { 
     Arrays.fill(cs, ' '); 
    } 
    for (int i = 0; i < size; i++) { 
     int l = Math.abs(mid - 1 - i); 
     int r = size - l; 
     for (int m = l; m < r; m++) { 
      matrix[i][m] = chars[m]; 
     } 
    } 
    for (char[] cs : matrix) { 
     System.out.println(cs); 
    } 

出力

 I   
     NIV  
     ANIVE  
     ANIVER  
    Z ANIVERS  
    IZ ANIVERSA 
    LIZ ANIVERSAR 
ELIZ ANIVERSARI 
FELIZ ANIVERSARIO 
ELIZ ANIVERSARI 
    LIZ ANIVERSAR 
    IZ ANIVERSA 
    Z ANIVERS  
     ANIVER  
     ANIVE  
     NIV  
     I   
関連する問題