如何使用打印格式围绕文本java制作框?

时间:2015-01-16 05:46:34

标签: java printf

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.   |
+--------------+

5 个答案:

答案 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             |
+-------------------+