【问题标题】:Print train with characters打印带字符的火车
【发布时间】:2023-04-10 07:46:01
【问题描述】:

我正在尝试找到一种使用字符在 Java 中打印火车的好方法。

     ++      +------
     ||      |+-+ | 
   /---------|| | | 
  + ========  +-+ | 
 _|--/~\------/~\-+ 
//// \_/      \_/   

到目前为止我的解决方法:

  • 使用字符串数组并逐行保存。

例如

String[] array = new String[10];
array[0] = "...";
array[1] = "...";
...

另一个想法是使用StringBuilder

有没有比使用StringBuilder更好的方法?

【问题讨论】:

标签: java string stringbuilder


【解决方案1】:

您可以大大简化创建数组的方式:

final String[] train = {
    "     ++      +------",
    "     ||      |+-+ | ",
    "   /---------|| | | ",
    "  + ========  +-+ | ",
    " _|--/~\\------/~\\-+ ",
    "//// \\_/      \\_/   "

};

然后要么逐行打印,要么先String.join

【讨论】:

  • 喜欢这个String result = String.join(Arrays.toString(train));?
  • 另外,我收到最后两行的错误消息“字符串文字中的非法转义字符”。你知道如何解决这个问题吗?我对这个话题比较陌生。
  • @LudwigvonDrake \ 需要转义,用\\ 替换每次出现的\ 应该可以解决它
  • @LudwigvonDrake 不,Arrays.toString 在这里不正确。 String.join 需要两个参数,数组以及要用作连接器的字符串。你会想要使用System.lineSeparator()
【解决方案2】:

将来,Java 将提供文本块 (https://openjdk.java.net/jeps/355)。您已经可以在 JDK 13 中将它们用作预览功能。

使用文本块,您可以编写如下内容:

String train = """
                   ++      +------
                   ||      |+-+ | 
                 /---------|| | | 
                + ========  +-+ | 
               _|--/~\------/~\-+ 
              //// \_/      \_/
              """;

【讨论】:

  • 需要同时使用编译时和运行时命令行参数来启用预览功能
  • 很遗憾,我只能在这个项目中使用 Java 8。
【解决方案3】:

要同时支持 Windows 和 Linux 行分隔符(\r\n\n),请使用 %nprintf

System.out.printf("     ++      +------%n" + 
                  "     ||      |+-+ | %n" + 
                  "   /---------|| | | %n" + 
                  "  + ========  +-+ | %n" + 
                  " _|--/~\\------/~\\-+ %n" + 
                  "//// \\_/      \\_/  %n");

它将编译为:

System.out.printf("     ++      +------%n     ||      |+-+ | %n   /---------|| | | %n  + ========  +-+ | %n _|--/~\\------/~\\-+ %n//// \\_/      \\_/  %n");

输出

     ++      +------
     ||      |+-+ | 
   /---------|| | | 
  + ========  +-+ | 
 _|--/~\------/~\-+ 
//// \_/      \_/  

【讨论】:

    【解决方案4】:

    忘记静态火车,做移动火车:)

    Java 11+

    package org.pta.train;
    
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class Main {
        public static final int FRAME_TIME = 300;
        public static final int CARS_COUNT = 10;
    
        public static final List<String> TRAIN = List.of(
                "            ".repeat(CARS_COUNT) + " . . . . . o o o o o      ",
                "___________ ".repeat(CARS_COUNT) + "_______    ____      o    ",
                "[] [] [] [] ".repeat(CARS_COUNT) + "[_____(__  ][]]_n_n__][.  ",
                "[_________]_".repeat(CARS_COUNT) + "[________]_|__|________)< ",
                "oo      oo '".repeat(CARS_COUNT) + " oo    oo 'oo 0000---oo\\_"
        );
    
        public static void main(String[] args) throws Exception {
            clearConsole();
    
            for (int i = 0; i < TRAIN.get(0).length(); i++) {
                printFrame(i);
    
                Thread.sleep(FRAME_TIME);
    
                clearConsole();
            }
        }
    
        private static void clearConsole() {
            System.out.print("\033[H\033[2J");
        }
    
        private static void printFrame(int i) {
            System.out.println(TRAIN.stream()
                    .map(line -> line.substring(line.length() - i))
                    .collect(Collectors.joining("\n")));
        }
    }
    

    P.S.:如果您从 IDE 运行 clearConsole() 可能会出现问题,但从 cmd 应该可以正常工作:)

    【讨论】:

      【解决方案5】:

      基本上,这是上一个答案。但是如果你想让它编译你需要转义\

      代码如下:

      public static void main(String[] args) {
      
          final String[] train = {
                  "     ++      +------",
                  "     ||      |+-+ | ",
                  "   /---------|| | | ",
                  "  + ========  +-+ | ",
                  " _|--/~\\------/~\\-+ ",
                  "//// \\_/      \\_/   "
      
          };
      
          System.out.println(String.join(System.lineSeparator(), train));
      }
      

      这只是 Java 8 :)

      【讨论】:

      • 基本上是现有答案的副本。应该作为评论提及
      • @SharonBenAsher 不能接受。提供了完整的工作代码。
      • "\n" 替换为System.lineSeparator(),使其在Windows 上使用\r\n
      【解决方案6】:

      我不建议在代码中使用这种设计,而是为了一个干净的解决方案,我建议为您的设计创建 txt 文件,然后阅读它们:

      设计文件

      阅读设计的代码

      public static void printDesign(String designName) {
          Path filePath = Paths.get(String.format("D:\\%s.txt", designName));
      
          try (Stream<String> lines = Files.lines(filePath)) {
              lines.forEach(System.out::println);
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      

      然后调用你的方法:

      printDesign("train");
      

      它为我打印:

      【讨论】:

        【解决方案7】:

        我会将整个绘图放入一个文本文件中。这样你就不需要为逃避特殊的字符和东西而烦恼。您可以使用Files.readAllLines()在一行中将整个文件读入字符串的List

        【讨论】:

          猜你喜欢
          • 2022-07-07
          • 1970-01-01
          • 1970-01-01
          • 2023-02-21
          • 1970-01-01
          • 1970-01-01
          • 2023-02-15
          • 2017-09-16
          • 1970-01-01
          相关资源
          最近更新 更多