Я хочу напечатать все вагоны поезда в одну линию.
Вот фрагмент кода, который печатает графику поезда, которая состоит из различных подвижного состава.
@Override
public String toString() {
StringBuilder trainGraphic = new StringBuilder();
for (RollingStock rollingStock : train) {
trainGraphic.append(rollingStock.toString());
}
return trainGraphic.toString();
}
Самый простой способ исправить это - настроить количество линий для всех вагонов таким образом, чтобы у каждого ascii art было одинаковое количество строк. Тем не менее, я хотел бы решить это по-другому. Как я могу получить количество линий в ascii art, чтобы я мог отрегулировать высоту всех вагонов в соответствии с наибольшим количеством линий текущего поезда?
Вот код, который я использую для печати вагона (в данном случае DieselEngine):
final String[] train = {
" _____________|____ ",
" /_| ____________ |_\ ",
"/ |____________| \",
"\ /",
" \__________________/ ",
" (O)(O) (O)(O) "
};
return String.join("
", train);
Например, этот универсал
++
||
_________||_________
| ___ ___ ___ ___ |
| |_| |_| |_| |_| |
|__________________|
|__________________|
(O) (O)
выше, чем этот
| |
| |
| |
|__________________|
(O) (O)
Всего 2 ответа
Мне нравится ваш проект, поэтому я, возможно, увлекся. По сути, вы делаете поезд двумерным массивом (массивом массивов), в котором каждый элемент train
представляет собой вагон. Вагон здесь - это просто массив строк, который содержит дизайн.
Я сделал метод для изменения высоты каждого вагона поезда, названный getHeightedArray()
(ужасное имя, я знаю).
Как правило, вы передаете необходимую высоту, а затем массив (вагон), который нужно изменить.
Используя некоторую математику, вы можете просто добавить пробел ""
в первые несколько позиций (высот) вагона, а затем поместить все существующие линии дизайна ниже пустых строк.
Вы можете поместить несколько пустых линий над линиями дизайна для каждой группы вагонов, тем самым увеличивая ее печатаемую высоту, но ее фактическая высота такая же.
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
, тогда вы печатаете ++
чтобы указать соединитель. Не стесняйтесь регулировать высоту разъема по пути.
Вы должны манипулировать String[] train
перед тем, как присоединиться. Таким образом, вы можете получить
// height
train.length
// width
train[0].length()