Лучший способ подойти к подобной проблеме - разбить проблему на все более мелкие части и код и протестировать каждую небольшую часть, пока не будет готово приложение. Одним из преимуществ этого является то, что у вас есть работающее приложение на каждом этапе, даже если это неполное приложение. Еще одно преимущество - когда вы сталкиваетесь с проблемой, вам нужно проверить небольшой фрагмент кода.
Сначала давайте сформулируем проблему еще раз.
Напишите приложение, чтобы полностью выровнять текст. Входные данные состоят из следующего:
Integer count of texts
Integer count of words in this text and integer count of columns, separated by a space
Text
Результат состоит из следующего:
Justified text bounded by bars
Текст должен быть исправлен так, чтобы предложения начинались с заглавной буквы, а все остальные буквы нижний регистр.
Дополнительный интервал в каждой строке следует простому правилу. Если есть один лишний пробел, добавьте его к последнему пробелу в строке. Если есть два дополнительных пробела, добавьте первый дополнительный пробел к последнему пробелу в строке и второй дополнительный пробел к первому пробелу в строке.
Вы продолжаете чередовать последние пробелы в строке и первые пробелы в строке, добавляя дополнительные пробелы, пока не дойдете до центрального пробела в строке.
Вот пример ввода и вывода.
2
2 6
caReEr dAyS!
6 10
Are You Ready For This Question?
Вывод:
|Career|
|days! |
|Are you|
|ready for|
|this |
|question? |
Мы можем разбить проблему на более мелкие задачи. Таким образом, когда мы кодируем каждую задачу, мы можем запустить один или несколько тестов, чтобы убедиться, что мы правильно закодировали задачу.
Введите целые числа и текст.
Обработайте текст, чтобы составить правильные предложения.
Выровняйте исправленный текст.
Давайте займемся первой задачей .
Мы напишем код для чтения ввода и вывода текста. Это подтвердит, что у нас работает основная структура приложения. Использование Scanner
может быть непростым. Вы должны обязательно использовать разделители строк, если обрабатываете целые числа с помощью метода Scanner
nextInt
.
Вот результаты теста для первой задачи. Первые три строки составляют ввод, а четвертая строка - тестовый вывод, который на данный момент просто выводит строку ввода текста.
1
2 6
caReEr dAyS!
caReEr dAyS!
А вот код, который запускал этот тест.
import java.util.Scanner;
public class FullJustification {
public static void main(String[] args) {
new FullJustification().processInput();
}
public void processInput() {
Scanner scanner = new Scanner(System.in);
int cases = scanner.nextInt();
scanner.nextLine();
int[] wordCount = new int[cases];
int[] columnCount = new int[cases];
String[] text = new String[cases];
for (int i = 0; i < cases; i++) {
wordCount[i] = scanner.nextInt();
columnCount[i] = scanner.nextInt();
scanner.nextLine();
text[i] = scanner.nextLine();
System.out.println(text[i]);
}
scanner.close();
}
}
Пока все хорошо. Теперь у нас есть основа, чтобы добавить немного больше кода и запустить больше тестов.
Давайте займемся второй задачей.
Мы можем разбить вторую задачу еще дальше, чтобы упростить код.
Проверьте, есть ли во вводимом тексте символы.
Преобразование текста в нижний регистр.
Преобразуйте текст в массив символов и сделайте первую букву заглавной.
Найдите первую непустую букву после знака препинания (.?!) И сделайте ее заглавной.
Вот результаты теста из второй задачи. Опять же, мы просто выводим введенный текст, хотя для этого теста текст должен быть исправлен.
2
2 6
caReEr dAyS!
Career days!
8 10
Are You Ready For This Question? I am!
Are you ready for this question? I am!
Как видите, текст исправлен. Вот код, который запускал этот тест.
import java.util.Scanner;
public class FullJustification {
public static void main(String[] args) {
new FullJustification().processInput();
}
public void processInput() {
Scanner scanner = new Scanner(System.in);
int cases = scanner.nextInt();
scanner.nextLine();
int[] wordCount = new int[cases];
int[] columnCount = new int[cases];
String[] text = new String[cases];
for (int i = 0; i < cases; i++) {
wordCount[i] = scanner.nextInt();
columnCount[i] = scanner.nextInt();
scanner.nextLine();
text[i] = scanner.nextLine();
text[i] = correctText(text[i]);
System.out.println(text[i]);
}
scanner.close();
}
private String correctText(String input) {
if (input.length() <= 0) {
return input;
}
char[] letter = input.toLowerCase().toCharArray();
letter[0] = Character.toUpperCase(letter[0]);
String punctuation = ".?!";
boolean capitalize = false;
for (int i = 1; i < letter.length; i++) {
if (letter[i] == ' ') {
continue;
} else if (capitalize) {
letter[i] = Character.toUpperCase(letter[i]);
capitalize = false;
} else if (contains(punctuation, letter[i])) {
capitalize = true;
}
}
return new String(letter);
}
private boolean contains(String punctuation, char c) {
for (int i = 0; i < punctuation.length(); i++) {
if (punctuation.charAt(i) == c) {
return true;
}
}
return false;
}
}
В этой итерации гораздо легче увидеть, что мы используем методы и сохраняем содержимое каждого метода относительно коротким. Опять же, это значительно упрощает поиск проблем. Мы провели не менее полдюжины тестов на этом коде. На этом этапе мы практически уверены, что ввод правильно читается и текст правильно трансформируется.
Этот код - не единственный способ кодирования этих задач. Есть и другие способы, одни более эффективные, чем другие. Моя цель здесь - предоставить простой для понимания код.
С этой базой solid теперь вы можете сосредоточиться на третьей задаче. Я оставляю эту задачу в качестве упражнения для ОП, поскольку это основная часть его задания. Я надеюсь, что этот ответ будет полезен в обучении подходу к любой постановке проблемы.
Разбейте проблему на более мелкие и мелкие части, кодируйте и проверяйте каждую небольшую часть, пока не получите полное приложение.
Разделяй и властвуй.
Отредактировано для добавления
Третий пример, приведенный ОП, скрывал требование, которое оказалось очень трудно решить. Я добавил требование к описанию проблемы.
Пример ввода
1
34 20
this is going to be a big sample to show how you should solve this problem. I hope this sample can show you what you want. please, try to solve this problem. love you!
Пример вывода
|This is going to be|
|a big sample to show|
|how you should solve|
|this problem. I hope|
|this sample can show|
|you what you want.|
|Please, try to solve|
|this problem. Love|
|you! |
Дополнительное требование определяет, где добавить лишние пробелы, чтобы полностью оправдать текст.
В строке «Это будет» есть 4 места, где можно разместить дополнительное пространство. В этом примере к четвертому пробелу в строке добавляется один дополнительный пробел.
Строка «вы то, что хотите». имеет 3 места, где можно разместить два дополнительных места. В этом примере одно дополнительное пространство добавляется к 3-му пространству, а другое дополнительное пространство добавляется к 1-му пространству.
Из этой ограниченной информации я вывел требование, чтобы дополнительные пространства распределялись по чередующемуся шаблону , начиная с последнего пробела, затем первого пробела, затем предпоследнего пробела, затем второго пробела, пока не дойдете до центрального пробела.