使用 java 创建文本文件 table 并填充

Create a text file table with java with padding

由于我的上一篇文章和问题非常模糊,所以这里是我目前的来源和一个更清晰的问题。现在都是关于填充的。

这是我到目前为止的代码:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

public class makeTable {


static ArrayList<String> val1 = new ArrayList<>(Arrays.asList("field1", "field1val2", "field1val3"));
static ArrayList<String> val2 = new ArrayList<>(Arrays.asList("field2", "field2val2", "field2val3"));
static int col1=15;
static int col2=15;

public static void main(String arg[]) {

BufferedWriter writeTable = null;
try {
    writeTable = new BufferedWriter(new FileWriter("C:/testtable.txt"));

    //Anfang erste Zeile
    writeTable.write("+ ");
    for (int i = 0; i < col1; i++){
        writeTable.write("-");   
    }
    writeTable.write(" + ");
    for (int i = 0; i < col2; i++){
        writeTable.write("-");   
    }
    writeTable.write(" +");
    writeTable.newLine();
    //Ende erste Zeile

    for (int i = 0; i < val1.size(); i++){
        writeTable.write("| " + val1.get(i) + "   "+ " + " +"   "+ val2.get(i) +  "   "+ " |");
        writeTable.newLine();

        writeTable.write("+ ");
        for (int j = 0; j < col1; j++){
            writeTable.write("-");   
        }
        writeTable.write(" + ");
        for (int m = 0; m < col2; m++){
            writeTable.write("-");   
        }
        writeTable.write(" +");
        writeTable.newLine(); 

    }
} catch (IOException e) {
    System.err.println(e);
} finally {
    if (writeTable != null) {
        try {
            writeTable.close();
        } catch (IOException e) {
            System.err.println(e);
        }
    }
}
}
}

现在我需要添加一个填充,使结果看起来像:

+ -------------- + -------------- +
|     field1     |     filed2     |
+ -------------- + -------------- + 
|   field1val2   |   field2val2   | 
+ -------------- + -------------- + 

等等。它需要居中。我只能考虑添加类似 val1.get(i).length() /2 的内容,这就是要添加的 " " 的数量....但我该怎么做?

我不能使用其他库(第 3 方库)。

在下面的代码中,将 append 更改为 StringBuilder 并更改为 BufferedWriter

public void appendCentered(StringBuilder sb, String s, int width) {
    if (s.length() > width) {
        s = s.substring(0, width);
    }
    int spaces = width - s.length();
    int before = spaces / 2;
    int after = spaces - before; // Could be 1 more than 'before'.
    appendSpaces(sb, before);
    sb.append(s);
    appendSpaces(sb, after);
}

public void appendSpaces(StringBuilder sb, int width) {
    while (width-- > 0) {
        sb.append(' ');
    }
}

这是我将文本居中后您的程序的结果。

+ -------------- + -------------- +
|     field1     +     field2     |
+ -------------- + -------------- +
|   field1val2   +   field2val2   |
+ -------------- + -------------- +
|   field1val3   +   field2val3   |
+ -------------- + -------------- +

这是我所做的更改。

  1. 我所做的最重要的事情是将您的整体代码分解为方法。通过编写小方法,您可以将较大的任务分解为较小的任务。较小的任务更容易编码。

  2. 一个 class 名称以大写字母开头。我将 makeTable 重命名为 MakeTable.

  3. 我更改了您的代码以使用 List 接口,而不是 ArrayList class。通过使用该接口,可以方便以后更改List的类型。我可以通过更改您的两行代码来使用 LinkedList。

  4. main 方法现在只创建输出。我无法直接写入 Windows 8.1 笔记本电脑上的 C 盘。我必须在与代码相同的目录中创建文件。

  5. writeDashedLine 方法写入虚线。我在 2 个地方使用了代码,但是通过将代码放入方法中,我只需要编写一次代码。

  6. writeDashes 方法写入虚线的破折号部分。同样,我在 2 个地方使用了代码,但是通过将代码放入方法中,我只需要编写一次代码。

  7. writeValueLine 方法将值写入一行。我在一个地方使用了代码,但是为了和writeDashedLine方法保持一致,我为代码写了一个方法

  8. 剩下的方法就是我写的居中文字。首先,我在 2 个值列表中找到了最长的值。接下来,我添加了 padding 的 4 个字符。接下来,我通过在字符串的前后添加填充来使文本居中。

学习这些方法,将来做这类任务。

这是格式化代码。

package com.ggl.testing;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MakeTable {

    static List<String> val1 = new ArrayList<>(Arrays.asList("field1",
            "field1val2", "field1val3"));
    static List<String> val2 = new ArrayList<>(Arrays.asList("field2",
            "field2val2", "field2val3"));

    static int length = getLongestValue(val1, val2) + 4;

    public static void main(String arg[]) {

        BufferedWriter writeTable = null;
        try {
            writeTable = new BufferedWriter(new FileWriter("testtable.txt"));

            writeDashedLine(writeTable);
            writeTable.newLine();
            // Ende erste Zeile

            for (int i = 0; i < val1.size(); i++) {
                writeValueLine(writeTable, val1.get(i), val2.get(i));
                writeTable.newLine();

                writeDashedLine(writeTable);
                writeTable.newLine();

            }
        } catch (IOException e) {
            System.err.println(e);
        } finally {
            if (writeTable != null) {
                try {
                    writeTable.close();
                } catch (IOException e) {
                    System.err.println(e);
                }
            }
        }
    }

    public static void writeDashedLine(BufferedWriter writeTable)
            throws IOException {
        // Anfang erste Zeile
        writeTable.write("+ ");
        writeDashes(writeTable);
        writeTable.write(" + ");
        writeDashes(writeTable);
        writeTable.write(" +");
    }

    public static void writeDashes(BufferedWriter writeTable)
            throws IOException {
        for (int i = 0; i < length; i++) {
            writeTable.write("-");
        }
    }

    public static void writeValueLine(BufferedWriter writeTable, String value1,
            String value2) throws IOException {
        writeTable.write("| " + centerText(value1, length) + " + "
                + centerText(value2, length) + " |");
    }

    public static String centerText(String text, int length) {
        int textLength = text.length();
        if (textLength > length) {
            return text.substring(0, length);
        } else if (textLength == length) {
            return text;
        } else {
            int diff1 = (length - textLength) / 2;
            int diff2 = length - textLength - diff1;
            return getPadding(' ', diff1) + text + getPadding(' ', diff2);
        }
    }

    public static String getPadding(char pad, int length) {
        String padding = "";

        for (int i = 0; i < length; i++) {
            padding += pad;
        }

        return padding;
    }

    public static int getLongestValue(List<String> val1, List<String> val2) {
        int length = 0;

        for (String s : val1) {
            length = Math.max(length, s.length());
        }

        for (String s : val2) {
            length = Math.max(length, s.length());
        }

        return length;
    }
}