2015-05-29 67 views
-2

由於我的上一個文本和問題非常模糊,因此我現在的源代碼和一個更清晰的問題。現在是關於填充。用java填充文本文件表

這裏是我的代碼到現在:

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的東西,那就是添加....「的數量,但我該怎麼做?

我不能使用其他庫(第三方庫)。

+1

究竟是什麼問題?如何寫入文件?或者如何獲得這種模式? – jbx

+0

主要是如何獲取表格的值與模式。 – Thevagabond

+2

這個小圖書館可能會有所幫助:https://github.com/assylias/Java-Text-Table-Formatter – assylias

回答

1

在下面的代碼中更改appendStringBuilderBufferedWriter

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(' '); 
    } 
} 
2

下面是我的文字居中後的程序結果。

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

以下是我所做的更改。

  1. 我做的最大的事情是把你的單片代碼分解成方法。通過編寫小方法,您可以將較大的任務分解爲較小的任務。較小的任務更容易編碼。

  2. 類名以大寫字母開頭。我將makeTable改名爲MakeTable。

  3. 我改變了你的代碼來使用List接口,而不是ArrayList類。通過使用該接口,將來可以更輕鬆地更改List的類型。我可以通過更改2行代碼來使用LinkedList。

  4. 現在的主要方法只是創建輸出。我無法直接寫入Windows 8.1筆記本電腦上的C驅動器。我不得不在與代碼相同的目錄中創建文件。

  5. writeDashedLine方法寫入一條虛線。我在2個地方使用代碼,但通過將代碼放入方法中,我只需編寫一次代碼。

  6. writeDashes方法寫入虛線的虛線部分。再次,我使用2個地方的代碼,但通過將代碼放入方法中,我只需編寫一次代碼。

  7. writeValueLine方法將值寫入一行。我在一個地方使用代碼,但爲了與writeDashedLine方法保持一致,我爲代碼編寫了一個方法。

  8. 其餘的方法是我寫給中心文本。首先,我在兩個值列表中找到了最長的值。接下來,我添加了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; 
    } 
}