java - 调整 ASCII 艺术的高度,使不同的图形打印在同一行

标签 java string

我想在同一行中打印火车的所有车厢。

这是一个代码片段,用于打印由不同机车车辆组成的火车图形。

    @Override
    public String toString() {
        StringBuilder trainGraphic = new StringBuilder();
        for (RollingStock rollingStock : train) {
            trainGraphic.append(rollingStock.toString());
        }
        return trainGraphic.toString();
    }

解决此问题的最简单方法是调整所有货车的行数,以便每个 ASCII 艺术都有相同的行数。但是,我想以不同的方式解决它。如何获取ascii art的行数,以便我可以将所有车厢的高度调整为当前火车的最高行数?

这是我用来打印货车的代码(在本例中是 DieselEngine):

        final String[] train = {
                "  _____________|____  ",
                " /_| ____________ |_\\ ",
                "/   |____________|   \\",
                "\\                    /",
                " \\__________________/ ",
                "  (O)(O)      (O)(O)  "
        };
        return String.join("\n", train);

例如这辆马车

         ++         
         ||         
_________||_________
|  ___ ___ ___ ___ |
|  |_| |_| |_| |_| |
|__________________|
|__________________|
   (O)        (O)   

比这个高

|                  |
|                  |
|                  |
|__________________|
   (O)        (O)   

Here

最佳答案

我喜欢你的项目,所以我可能得意忘形了。基本上,您将 train 制作为一个二维数组(数组的数组),其中 train 的每个元素都是一辆马车。这里的马车只是一个字符串数组,其中包含设计。

我制作了一个方法来改变火车每节车厢的高度,称为getHeightedArray()(我知道这个名字很糟糕)。

基本上,您传递所需的高度,然后传递要更改的数组(货车)。

使用一些数学知识,您可以在货车的前几个位置(高度)添加一个空白的"",然后将所有现有的设计线放置在空白线下方。

TL;DR

您可以在每个货车阵列的设计线上方放置一些空行,从而使其可打印高度更高,但其实际高度是相同的。

public static void main()
{
    String[] wagon1 = {
            "  _____________|____  ",
            " /_| ____________ |_\\ ",
            "/   |____________|   \\",
            "\\                    /",
            " \\__________________/ ",
            "  (O)(O)      (O)(O)  "
        };
    String[] wagon2 = {
            "         ++         ",
            "         ||         ",
            "_________||_________",
            "|  ___ ___ ___ ___ |",
            "|  |_| |_| |_| |_| |",
            "|__________________|",
            "|__________________|",
            "   (O)        (O)   "
        };

    String[][] train = {wagon1, wagon2, wagon1, wagon2};

    int max_height = 0;

    for(int i = 0; i < train.length; i++)
    {
        String[] wagon = train[i];
        if(wagon.length > max_height)
        {
            max_height = wagon.length;
        }
    }

    //printTrain(train, max_height);

    for(int i = 0; i < train.length; i++)
    {
        train[i] = getHeightedArray(max_height, train[i]);
        train[i] = getWidthedArray(train[i]);
    }

    printTrain(train, max_height);
}

public static String[] getHeightedArray(int heightNeeded, String[] wagon)
{
    String[] return_arr = new String[heightNeeded];
    for(int i = 0; i < heightNeeded-wagon.length; i++)
    {
        return_arr[i] = "";
    }
    for(int i = 0; i < wagon.length; i++)
    {
        return_arr[i+heightNeeded-wagon.length] = wagon[i];
    }
    return return_arr;
}

public static String[] getWidthedArray(String[] wagon)
{
    String[] return_wagon = new String[wagon.length];

    int max_width = 0;
    for(int i = 0; i < wagon.length; i++)
    {
        if(wagon[i].length() > max_width)
        {
            max_width = wagon[i].length();
        }
    }

    for(int i = 0; i < wagon.length; i++)
    {
        return_wagon[i] = wagon[i];
        for(int j = 0; j < max_width-wagon[i].length(); j++)
        {
            return_wagon[i] += " ";
        }
    }
    return return_wagon;
}

public static void printTrain(String[][] train, int max_height)
{
    int heightOfConnector = 2; // 1 means the connector is at the wheel level, so I chose 2
    for(int i = 0; i < max_height; i++) // Controls the height, 0 means the top
    {
        for(int j = 0; j < train.length; j++) // Controls the wagon index
        {
            if(heightOfConnector == max_height-i && j != train.length-1)
                System.out.print(train[j][i]+" ++ ");
            else
                System.out.print(train[j][i]+"    ");
        }
        System.out.println();
    }
}

编辑1:我是个笨蛋,所以之前版本的代码由于一些错误而无法运行。基本原理和我已经说过的一样,但有一些错别字。抱歉。

getWidthedArray() 确保马车整个车身的宽度一致,如果不是,您只需在每条不均匀线的末尾添加空格即可。

printTrain() 就是神奇之处。您打印每个货车的顶层(用几个空格分隔),然后打印第二高的层,依此类推。如果您处于 heightOfConnector 指定的级别,则打印 ++ 来指示连接器。顺便随意调整连接器的高度。

关于java - 调整 ASCII 艺术的高度,使不同的图形打印在同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60182778/

相关文章:

java - 如何将 lucene documentid 映射到 Hibernate 搜索实体字段

java - 如何防止 EclipseLink (JPA 2.0) 清除我的数据库/表?

java - 如何将日期解析为 EEE MMM dd HH :mm:ss zzz yyyy format?

c++ - 将通过引用传递的两个字符转换为字符串?

c++ - 满足条件时跳转到下一个字符串

java - BorderLayout West Center East all 等宽

java - 定制 Jersey 注入(inject)

Java - 检查两个字符串的交集

python - 选择字符串中的日期

c++ - 在 vector 中按一个词查找行