public static void printBox(Scanner in, int length) {
int spacesNeeded = 0;
System.out.print("+");
for (int i = 0; i <= length + 1; i++) {
System.out.print("-");
}
System.out.print("+");
System.out.println();
while (in.hasNext()) {
System.out.println("| " + in.nextLine() + " |");
}
System.out.print("+");
for (int i = 0; i <= length + 1; i++) {
System.out.print("-");
}
System.out.print("+");
System.out.println();
}
上面的代码创建了一个这样的框:
+--------------+
| This is some |
| text here. |
+--------------+
我需要找到一种更好的方法来格式化这个框,并使用甚至可能是System.printf来创建线条?或者更好的循环过程。
最终产品需要:
+--------------+
| This is some |
| text here. |
+--------------+
答案 0 :(得分:2)
让我们首先编写一个例程来获取String
(s)的最大长度;
private static int getMaxLength(String... strings) {
int len = Integer.MIN_VALUE;
for (String str : strings) {
len = Math.max(str.length(), len);
}
return len;
}
以及填充String
(s)的方法。填充可以用
private static String padString(String str, int len) {
StringBuilder sb = new StringBuilder(str);
return sb.append(fill(' ', len - str.length())).toString();
}
然后填写String
len
重复字符ch
,如
private static String fill(char ch, int len) {
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++) {
sb.append(ch);
}
return sb.toString();
}
最后,printBox
确定最长String
的长度。构建一个顶部(和底线),然后在String
(s)上迭代String
执行填充(如果需要),然后使用格式化输出 - | str |
,如
public static void printBox(String... strings) {
int maxBoxWidth = getMaxLength(strings);
String line = "+" + fill('-', maxBoxWidth + 2) + "+";
System.out.println(line);
for (String str : strings) {
System.out.printf("| %s |%n", padString(str, maxBoxWidth));
}
System.out.println(line);
}
然后(例如)
public static void main(String[] args) {
printBox("Thie is some", "text here.");
}
输出
+--------------+
| Thie is some |
| text here. |
+--------------+
答案 1 :(得分:0)
如果你某些这些行不会太长,你可以将它用于你最内层的循环:
while (in.hasNext()) {
String s = in.nextLine();
int spaces = length - s.length();
System.out.print("| " + s);
while (spaces-- > 0)
System.out.print(" ");
System.out.println(" |");
}
这为您提供如下输出:
+----------------------+
| hello there |
| my name is pax |
+----------------------+
的长度为20
,扫描仪提供这些行。
在这种情况下,如果行长于预期,您会看到如下内容:
+----------------------+
| hello there |
| my name is pax |
| This line is way too long |
+----------------------+
所以,如果可能的话,您可能希望在前面扫描所有行(进入某种类型的集合),随时跟踪最大长度。然后使用 长度来决定如何打印出来。
换句话说,像这样的东西,也重构了顶部和底部边缘的代码,因为这是一个很好的做法:
public static void topBottom (int length) {
System.out.print("+");
for (int i = 0; i <= length + 1; i++)
System.out.print("-");
System.out.println("+");
}
public static void printBox(Scanner in, int length) {
ArrayList<String> lines = new ArrayList<String>();
while (in.hasNext()) {
String s = in.nextLine();
if (s.length() > length)
length = s.length();
lines.add(s);
}
topBottom(length);
for (String s: lines) {
int spaces = length - s.length();
System.out.print("| " + s);
while (spaces-- > 0)
System.out.print(" ");
System.out.println(" |");
}
topBottom(length);
}
适应最长线:
+-------------------------------------------------------------+
| hello there |
| my name is pax |
| and this is a very long line designed to test the functions |
+-------------------------------------------------------------+
答案 2 :(得分:0)
如果您的长度已修复,则可以使用以下代码
import org.apache.commons.lang.StringUtils;
String s;
while (in.hasNext()) {
s = in.nextLine();
System.out.println("| " + s + StringUtils.repeat(" ", length - s.length()) + " |");
}
答案 3 :(得分:0)
这可以通过存储字符串并在所有句子(maxLength
)中查找最大宽度然后打印它们来实现。
Scanner in=new Scanner(System.in);
int maxLength=0;
List<String> list = new ArrayList<>();
String s="";
while (in.hasNext()) {
s=in.nextLine();
list.add(s);
if(maxLength<s.length())
maxLength=s.length();
}
System.out.print("+");
for (int i = 0; i <= maxLength+1 ; i++) {
System.out.print("-");
}
System.out.println("+");
for(int i=0;i<list.size();i++)
{
System.out.print("| ");
s=list.get(i);
System.out.print(s);
for(int k=s.length();k<=maxLength;k++)
System.out.print(" ");
System.out.println("|");
}
System.out.print("+");
for (int i = 0; i <= maxLength+1 ; i++) {
System.out.print("-");
}
System.out.println("+");
这将产品输出为
+--------------+
| hello |
| good morning |
| have a |
| nice day |
+--------------+
答案 4 :(得分:0)
尝试使事物变得动态,而不是硬编码的值。
- &GT;事先从用户那里获取输入
- &GT;扫描输入并找到输入中字的最大长度
- &GT;根据最大字长调整间距
这是一个工作正常的程序: -
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int length = 10;
int spacesNeeded = 0;
int size = 0;
System.out.println("How many inputs?");
size = Integer.parseInt(in.nextLine());
String[] inputs = new String[size];
System.out.println("Enter words");
for (int i = 0; i < size; i++) {
inputs[i] = in.nextLine();
}
System.out.print("+");
int maxsize = 0;
for (String s : inputs) {
if (s.length() > maxsize) {
maxsize = s.length();
}
}
for (int i = 0; i <= maxsize + 1; i++) {
System.out.print("-");
}
System.out.print("+");
System.out.println();
for (int j = 0; j < inputs.length; j++) {
System.out.print("| " + inputs[j]);
for (int i = inputs[j].length(); i <= maxsize; i++) {
System.out.print(" ");
}
System.out.print(" |");
System.out.println();
}
System.out.print("+");
for (int i = 0; i <= maxsize + 1; i++) {
System.out.print("-");
}
System.out.print("+");
System.out.println();
in.close();
}
输出: -
+-------------------+
| helodejfnsdjfnsdf |
| dfdf |
| dfdf |
| sdfsdf |
+-------------------+