以编程方式将文本输出置于for循环中

时间:2017-04-27 21:36:16

标签: java

我试图推出以下的字符模式:

String y = "";
for(int i = 0; i < 10; i++)
{
      y="";
      for(int s = 0; s < i; s++)
      {
         y+= "x";
      }
      System.out.println(y);
}

这就是我现在所拥有的:

x
xx
xxx
xxxx
xxxxx
xxxxxx
xxxxxxx
xxxxxxxx

此输出

x

这是一种方法。我很清楚目标模式每次执行循环时增加两个instance Applicative Route where,我知道我必须使用空格并插入它们。但是,我坚持这个非常简单的任务。

编辑:任务是只使用两个循环。不过我想到了使用三种方式的方法,但无法直接找到使用两个循环的方法。

7 个答案:

答案 0 :(得分:2)

我使用1 for循环和1 for语句(不是循环),而不是使用两个if循环。

    String spaces = "     ";
    String word = "";
    String X = "x";
    for(int i = 10; i > 0; i--) {
        if (i%2 == 0) {
         word = spaces + X;  
         System.out.println(word);
         spaces = spaces.replaceFirst(" ","");
         X += "xx";
        }
    }

输出就是你问的:

     x
    xxx
   xxxxx
  xxxxxxx
 xxxxxxxxx

答案 1 :(得分:1)

您可以通过一个循环来解决您的问题,您可以将padLeftString.format一起使用,这是一个简单的示例:

public static void main(String args[]) {
    int n = 5;
    String str;
    for (int i = n; i > 0; i--) {
        str = String.format("%0" + ((n - i) * 2 + 1) + "d", 0).replace("0", "x");
        System.out.println(String.format("%1$" + ((i - 1 + str.length())) + "s", str));
    }
}

<强>输出

    x
   xxx
  xxxxx
 xxxxxxx
xxxxxxxxx

答案 2 :(得分:1)

由于这个问题有许多不同的可能答案,这只是一种可能的解决方案。

对于这个解决方案,我不打算在X之后打印空格。我只打印之前的那些。

int baseWidth = 10;


for (int a = baseWidth ; a > 0 ; a--) {
  for (int b = 0 ; b < a - 1 ; b++) {
    System.out.print(" ");
  }

  for (int b = a - 1 ; b < baseWidth - (a - 1) ; b++) {
    System.out.print("X");
  }

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

对于baseWidth = 10,上面代码的结果如下:

    XX
   XXXX
  XXXXXX
 XXXXXXXX
XXXXXXXXXX

对于baseWidth = 9:

,上述代码的结果如下
    X
   XXX
  XXXXX
 XXXXXXX
XXXXXXXXX

在您的帖子编辑之后,下一个代码片段执行与前一个相同的功能,但只有两个循环。

int baseWidth = 9;


for (int a = baseWidth ; a > 0 ; a--) {
  for (int b = 0 ; b < baseWidth - (a - 1) ; b++) {
    if (b < a - 1) {
      System.out.print(" ");
    }

    if (b >= a - 1 && b < baseWidth - (a - 1)) {
        System.out.print("X");
    }
  }

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

答案 3 :(得分:1)

为了好玩,让我们也有一个无循环的解决方案:

static Stack<String> getStarryStrings (String lastString, Stack<String> result) {
    //First count the number of *'s in the string
    //From:http://stackoverflow.com/questions/275944/java-how-do-i-count-the-number-of-occurrences-of-a-char-in-a-string
    int starCount = lastString.length() - lastString.replace("*", "").length();
    if(starCount<1) return result;
    result.push(lastString);

    //Find first and last occurrences of *
    int fio = lastString.indexOf('*');
    int lio = lastString.lastIndexOf('*');

    //And replace them with white spaces
    StringBuilder nextLast = new StringBuilder(lastString);
    nextLast.replace(fio,fio+1," ");
    nextLast.replace(lio, lio + 1, " ");

    //And recurse...
    return getStarryStrings(nextLast.toString(),result);
}


public static void main(String[] args) {
    Stack<String> res = getStarryStrings("*********",new Stack<>());
    while(!res.isEmpty()) {
        System.out.println(res.pop());
    }

显示器:

    *    
   ***   
  *****  
 ******* 
*********

注意: 我确信这可以通过更有效的方式完成,以消除对java.util.Stack的需求。我唯一的标准是不使用循环。我让堆栈保留在那里以显示解决方案的递归性质。可以很容易地改进它来使用StringBuilder来代替堆栈。

答案 4 :(得分:0)

保持两个指针l&amp; r将决定您必须在哪个位置打印*否则打印空间。每行后减少l并将r增加1,因为三角形在每行中向左和向右增长1步。

仅使用两个循环...

int n = 5; // number of lines...
int l = n-1, r = n-1;
for(int i = 0; i < n; i++) {
    for(int s = 0; s < 2*n; s++) {
        if(s >= l && s<= r)
            System.out.print("*");
        else
            System.out.print(" ");
    }
    System.out.println();
    l--; r++;
}

输出:

    *
   ***
  *****
 *******
*********

答案 5 :(得分:0)

两圈。

char[] s = "           ".toCharArray();
int start = 5;
int end = 5;
for (int i = 0; i < 5; i++) {
    for (int j = start; j <= end; j++) {
        s[j] = 'x';

    }       
    start--;
    end++;
    System.out.println(s);
}

一个循环

char[] s = "           ".toCharArray();
int start = 4;
int end = 5;
for (int i = 0; i < 5; i++) {
    Arrays.fill(s, start, end, 'x');//Remembering importing Arrays class
    start--;
    end++;
    System.out.println(s);
}

答案 6 :(得分:0)

您可能想看看这个:

public class CenterText {
    public static void main(String[] args){
        centerText(10, 'X');
    }

    public static void centerText(int noOfLines, char theChar){

        final int totalNoOfChars = noOfLines * 2;
        String totalSpaces = "";
        String chars = "";

        for (int i=0; i<totalNoOfChars; i++){
            totalSpaces += " ";
        }

        for (int j=1 ; j<=totalNoOfChars; j++){
            chars+=theChar;
            if(j%2==0){
                System.out.println(totalSpaces.substring(0, noOfLines-(j/2)) + chars);
            }       
        }   
  }


}

示例:

输入:

centerText(10, 'X');

输出:

         XX
        XXXX
       XXXXXX
      XXXXXXXX
     XXXXXXXXXX
    XXXXXXXXXXXX
   XXXXXXXXXXXXXX
  XXXXXXXXXXXXXXXX
 XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX

输入:

centerText(7, '#');

输出:

      ##
     ####
    ######
   ########
  ##########
 ############
##############