打印同一行遇到问题

3

我试图编写一段代码,在控制台中输入一个整数,然后显示由字母组成的更大的整数(类似于ASCII艺术)。

假设输入为112,那么输出将会是:

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

我的代码输出结果是一样的,只是不在同一行 :(

它会将一个数字打印在另一个数字下面.. 从我的代码中可以看出原因:

import java.util.Scanner;
public class Tester {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String any = input.nextLine();
        String[] sArray = any.split("");

        for(int i=0; i<sArray.length; i++){
            if(sArray[i].equals("1")){
                System.out.println("  #  ");
                System.out.println(" ##  ");
                System.out.println("# #  ");
                System.out.println("  #  ");
                System.out.println("  #  ");
                System.out.println("  #  ");
                System.out.println("#####");
            }
            if(sArray[i].equals("2")){
                System.out.println(" ##### ");
                System.out.println("#     #");
                System.out.println("      #");
                System.out.println(" ##### ");
                System.out.println("#      ");
                System.out.println("#      ");
                System.out.println("#######");
            }
        }
    }
}

我需要一次性打印全部内容,而不是像我的代码中使用println一次只输出一个。也许有一种简单的方法可以解决这个问题,最好不用改变整个代码?我能想象可以用二维数组来完成,但不确定。提示也是非常受欢迎的。这不是作业。


1
println 插入一个新行 - print 不会。但是你需要逐行打印,即改变你的循环逻辑。 - assylias
@assylias 我知道,但这怎么能在这里起作用呢?如果我用print替换println,输出看起来会更糟糕:D - cnmesr
2
你目前的逻辑与要求相差甚远,因为你正在垂直打印但你想要水平打印。 - Tim Biegeleisen
使用StringBuffer和append方法来处理每一行。 - gifpif
4个回答

3

粗糙但有效:

private static final Map<Integer, String[]> art = new HashMap<Integer, String[]>() {{
    put(1, new String[] {
            "   #   ",
            "  ##   ",
            " # #   ",
            "   #   ",
            "   #   ",
            "   #   ",
            " ##### " });
    put(2, new String[] {
            " ##### ",
            "#     #",
            "      #",
            " ##### ",
            "#      ",
            "#      ",
            "#######" });
    }};

public static void main(String[] args) {
    int[] input = { 1, 1, 2 };
    for (int row = 0; row < 7; row++) {
        for (int num : input) {
            System.out.print(art.get(num)[row] + " ");
        }
        System.out.println();
    }
}

我跳过了扫描器代码,假定输入为1 1 2

输出

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

2
使用 StringStringBuilder 存储每一行,最后打印所有字符串。
import java.util.Scanner;
public class Tester {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String any = input.nextLine();
        String[] sArray = any.split("");
        String str1 = "";
        String str2 = "";
        String str3 = "";
        String str4 = "";
        String str5 = "";
        String str6 = "";
        String str7 = "";
        for (int i = 0; i < sArray.length; i++) {
            if (sArray[i].equals("1")) {
                str1 += "  #  ";
                str2 += " ##  ";
                str3 += "# #  ";
                str4 += "  #  ";
                str5 += "  #  ";
                str6 += "  #  ";
                str7 += "#####";
            }
            if (sArray[i].equals("2")) {
                str1 += " ##### ";
                str2 += "#     #";
                str3 += "      #";
                str4 += " ##### ";
                str5 += "#      ";
                str6 += "#      ";
                str7 += "#######";
            }
        }
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str4);
        System.out.println(str5);
        System.out.println(str6);
        System.out.println(str7);
    }
}

你可以用StringBuffer替换String。 - gifpif
2
StringBuffer已经过时了。你可能想用StringBuilder。 - assylias
@assylias 在这段代码中,我没有考虑代码优化。据我理解,它们是初学者优化的代码,难以理解。我尝试在现有代码中进行最小更改。 - gifpif

2

建议的逻辑:

  • place the strings, line by line, in arrays:

    private static final String[] ONE = { "  #  ",
                                          " ##  ",
                                          ... };
    
  • run two nested for loops:

    for (int i = 0; i < heightOfPrintedDigits; i++) {
      for (String number : sArray) {
        ... //use print here but finish with an empty println("") to insert a new line
      }
    }
    

2
使用字符串数组来存储每个数字的多行表示,然后使用映射来存储所有数字。一个字符串数字可以作为键,返回该字符串数字的字符串数组表示。
final int NUM_HEIGHT = 7;
String any = "1 1 2";
String[] one = new String[] {
    "  #  ",
    " ##  ",
    "# #  ",
    "  #  ",
    "  #  ",
    "  #  ",
    "#####"};
String[] two = new String[] {
    " #####  ",
    "#     # ",
    "      # ",
    " #####  ",
    "#       ",
    "#       ",
    "####### "};
Map<String, String[]> map = new HashMap<>();
map.put("1", one);
map.put("2", two);

String[] numbers = any.split("\\s");
for (int i=0; i < NUM_HEIGHT; ++i) {
    StringBuilder line = new StringBuilder();
    for (String number : numbers) {
        line.append(map.get(number)[i]);
        line.append("  ");
    }
    System.out.println(line);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接