如何在 Java 中实现 justify() 方法
How to implement justify()-method in Java
我正在尝试创建自己的 justify()
方法,该方法将一个字符串和一个整数作为输入,并填充间距,使字符串的长度与给定整数的长度相同。我已按照 this 问题的答案进行操作。
我希望我的代码像这样工作:
Input = "hi hi hi" 20
Output = hi hi hi
我的代码如下所示:
//Add spaces to string until it is of desired length
static String justify(StringBuilder text, int width) {
String[] inputLS = text.toString().split(" "); //Split string into list of words
//Sum the length of the words
int sumOfWordLengths = 0;
for (String word : inputLS){ sumOfWordLengths += word.length(); }
int padding = width-sumOfWordLengths; //How much spacing we need
String lastWord = inputLS[inputLS.length - 1]; //Last word in list of strings
//Remove the last word
ArrayList<String> withoutLast = new ArrayList<>
(Arrays.asList(inputLS).subList(0, inputLS.length - 1));
StringBuilder result = new StringBuilder(); //Initialize StringBuilder
//Iterate over strings and add spacing (we do not add spacing to the last word)
while (padding > 0){
for(String word : withoutLast){
result.append(word).append(" ");
padding--;
}
}
result.append(lastWord); //Add the last word again
return result.toString();
}
public static void main(String[] args) {
// IO
Scanner scanner = new Scanner(System.in); //Initialize scanner
System.out.println("Please enter a string and an integer: "); //Ask for input from user
String line = scanner.nextLine(); //Get input-string from user
String[] strings = line.split(" "); //Split string at " " into list of strings
String text = strings[0]; //Get first element from list as string
int width = Integer.parseInt(strings[1]); //Get second element from list as an int
// Create a string with three times the input text with spaces between
StringBuilder forJustify = new StringBuilder();
for(int i=0; i<3; i++){ forJustify.append(text).append(" "); }
// Make sure the length of the string is less than the given int
if (text == null || text.length() > width) {
System.out.println(text);
throw new IllegalArgumentException("Whoops! Invalid input. Try again.");
}
System.out.println("Gave this as input:\t" + forJustify);
System.out.println("Justify:\t\t\t" + justify(forJustify, width));
}
这给了我这个输出:
Please enter a string and an integer:
hi 20
Gave this as input: hi hi hi
Justify: hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi
但我想要这个输出:
Please enter a string and an integer:
hi 20
Gave this as input: hi hi hi
Justify: hi hi hi
我知道 while-loop
有问题,但我不知道如何修复它。感谢所有帮助!
这个解决方案非常简单,使用 printf()
String test = "hi hi hi";
String[] tokens = test.split(" ");
int spacing = 20;
for (String token : tokens) {
System.out.printf("%" + spacing + "s", token);
}
System.out.println();
输出(right-justified):
hi hi hi
对于left-justify的解决方案,只需在百分号
后添加-
for (String token : tokens) {
System.out.printf("%-" + spacing + "s", token);
}
System.out.println();
输出:
hi hi hi
更新:提取理由作为函数:
public static void justify(int spacing, boolean leftJustified, String...words) {
for (String word : words) {
System.out.printf("%" + (leftJustified ? "-" : "") + spacing + "s", word);
}
System.out.println();
}
要使用,
public static void main(String[] args) {
String test = "hi hi hi";
String[] tokens = test.split(" ");
int spacing = 20;
justify(spacing, false, tokens); // right-justified
justify(spacing, true, tokens); // left-justified
}
我在使用上面的答案后想出了这个解决方案:
static String justify(StringBuilder text, int width) {
//Turn StringBuilder into an arraylist of strings
String[] words = text.toString().split(" ");
List<String> arraylist = Arrays.asList(words);
//Find the length of the words and length of the padding needed
int lengthOfWords = 3 * arraylist.get(0).length();
int pad = width - lengthOfWords;
//Add padding by using format on each word separately and then combine the strings and add last word
String result;
if (pad % 2 == 0){
String temp1 = String.format("%" + (-(pad / 2) - 2) + "s", words[0]);
String temp2 = String.format("%" + (-(pad / 2) - 2) + "s", words[0]);
result = temp1 + temp2 + words[0];
} else {
pad--;
String temp1 = String.format("%" + (-(pad / 2) - 2) + "s", words[0]);
String temp2 = String.format("%" + (-(pad / 2) - 2) + "s", words[0]);
result = temp1 + temp2 + words[0];
//Turn string into arraylist
ArrayList<Character> cs = new ArrayList<>();
for (char c : result.toCharArray()){ cs.add(c); }
//Add last whitespace between first and second word
int index = nextSpaceIndex(cs);
cs.add(index, ' ');
//Turn arraylist back to string
StringBuilder str = new StringBuilder();
for (Character c : cs) { str.append(c); }
result = str.toString();
}
return result;
}
这给了我这个输出:
Please enter a string and an integer:
hi 20
Justified: |hi hi hi|
我正在尝试创建自己的 justify()
方法,该方法将一个字符串和一个整数作为输入,并填充间距,使字符串的长度与给定整数的长度相同。我已按照 this 问题的答案进行操作。
我希望我的代码像这样工作:
Input = "hi hi hi" 20
Output = hi hi hi
我的代码如下所示:
//Add spaces to string until it is of desired length
static String justify(StringBuilder text, int width) {
String[] inputLS = text.toString().split(" "); //Split string into list of words
//Sum the length of the words
int sumOfWordLengths = 0;
for (String word : inputLS){ sumOfWordLengths += word.length(); }
int padding = width-sumOfWordLengths; //How much spacing we need
String lastWord = inputLS[inputLS.length - 1]; //Last word in list of strings
//Remove the last word
ArrayList<String> withoutLast = new ArrayList<>
(Arrays.asList(inputLS).subList(0, inputLS.length - 1));
StringBuilder result = new StringBuilder(); //Initialize StringBuilder
//Iterate over strings and add spacing (we do not add spacing to the last word)
while (padding > 0){
for(String word : withoutLast){
result.append(word).append(" ");
padding--;
}
}
result.append(lastWord); //Add the last word again
return result.toString();
}
public static void main(String[] args) {
// IO
Scanner scanner = new Scanner(System.in); //Initialize scanner
System.out.println("Please enter a string and an integer: "); //Ask for input from user
String line = scanner.nextLine(); //Get input-string from user
String[] strings = line.split(" "); //Split string at " " into list of strings
String text = strings[0]; //Get first element from list as string
int width = Integer.parseInt(strings[1]); //Get second element from list as an int
// Create a string with three times the input text with spaces between
StringBuilder forJustify = new StringBuilder();
for(int i=0; i<3; i++){ forJustify.append(text).append(" "); }
// Make sure the length of the string is less than the given int
if (text == null || text.length() > width) {
System.out.println(text);
throw new IllegalArgumentException("Whoops! Invalid input. Try again.");
}
System.out.println("Gave this as input:\t" + forJustify);
System.out.println("Justify:\t\t\t" + justify(forJustify, width));
}
这给了我这个输出:
Please enter a string and an integer:
hi 20
Gave this as input: hi hi hi
Justify: hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi
但我想要这个输出:
Please enter a string and an integer:
hi 20
Gave this as input: hi hi hi
Justify: hi hi hi
我知道 while-loop
有问题,但我不知道如何修复它。感谢所有帮助!
这个解决方案非常简单,使用 printf()
String test = "hi hi hi";
String[] tokens = test.split(" ");
int spacing = 20;
for (String token : tokens) {
System.out.printf("%" + spacing + "s", token);
}
System.out.println();
输出(right-justified):
hi hi hi
对于left-justify的解决方案,只需在百分号
后添加-
for (String token : tokens) {
System.out.printf("%-" + spacing + "s", token);
}
System.out.println();
输出:
hi hi hi
更新:提取理由作为函数:
public static void justify(int spacing, boolean leftJustified, String...words) {
for (String word : words) {
System.out.printf("%" + (leftJustified ? "-" : "") + spacing + "s", word);
}
System.out.println();
}
要使用,
public static void main(String[] args) {
String test = "hi hi hi";
String[] tokens = test.split(" ");
int spacing = 20;
justify(spacing, false, tokens); // right-justified
justify(spacing, true, tokens); // left-justified
}
我在使用上面的答案后想出了这个解决方案:
static String justify(StringBuilder text, int width) {
//Turn StringBuilder into an arraylist of strings
String[] words = text.toString().split(" ");
List<String> arraylist = Arrays.asList(words);
//Find the length of the words and length of the padding needed
int lengthOfWords = 3 * arraylist.get(0).length();
int pad = width - lengthOfWords;
//Add padding by using format on each word separately and then combine the strings and add last word
String result;
if (pad % 2 == 0){
String temp1 = String.format("%" + (-(pad / 2) - 2) + "s", words[0]);
String temp2 = String.format("%" + (-(pad / 2) - 2) + "s", words[0]);
result = temp1 + temp2 + words[0];
} else {
pad--;
String temp1 = String.format("%" + (-(pad / 2) - 2) + "s", words[0]);
String temp2 = String.format("%" + (-(pad / 2) - 2) + "s", words[0]);
result = temp1 + temp2 + words[0];
//Turn string into arraylist
ArrayList<Character> cs = new ArrayList<>();
for (char c : result.toCharArray()){ cs.add(c); }
//Add last whitespace between first and second word
int index = nextSpaceIndex(cs);
cs.add(index, ' ');
//Turn arraylist back to string
StringBuilder str = new StringBuilder();
for (Character c : cs) { str.append(c); }
result = str.toString();
}
return result;
}
这给了我这个输出:
Please enter a string and an integer:
hi 20
Justified: |hi hi hi|