簡體   English   中英

文字對齊方式格式不正確

[英]Text justification not formatting correctly

我正在嘗試制作一個程序,該程序將格式化輸入的文本,以便將每行設置為特定的長度,並且不能超過例如20,然后在每行上相應地設置字符格式並使用“。”。 填補空白以彌補設定的長度。

這是我到目前為止的輸出:

 This.is..an..example
 of..text..that..will
 have..straight..left
 and.right....margins
 after formatting ...

由於某種原因,“。” 在格式化之后和格式化之間以及“ g”之后都沒有出現,而是缺少了一個點,而取而代之的是空格。 這似乎總是發生在最后一行。

輸出結果如下所示:

 This.is..an..example
 of..text..that..will
 have..straight..left
 and.right....margins
 after.formatting....

碼:

import java.util.*;
public class FormattedPadding {
public static ArrayList<String> fullJustify(ArrayList<String> a, int b) {

    ArrayList<String> result = new ArrayList<String>();
    if(a == null || a.size() == 0)
        return result;
    int i = 0;
    int currentLength = 0;
    String temp = "";
    for(i = 0; i < a.size(); i++){
        currentLength += a.get(i).length() + 1;
        if(currentLength > b + 1) {
            result.add(temp);
            temp = "";
            currentLength = 0;
            i--;
            //System.out.println("Intermediate result: " + result);
        }
        else
            temp += a.get(i) + " ";
    }
    if(!temp.equals(""))
        result.add(temp);
    for(i = 0; i < result.size() - 1; i++){
        temp = result.get(i);
        String[] tempArray = temp.split(" ");
        int totalLength  = 0;
        for(int j =0; j < tempArray.length; j++)
            totalLength += tempArray[j].length();

        int[] spaceCount = getSpaceCount(b-totalLength, tempArray.length);
        for(int l =0; l < spaceCount.length; l++)
            System.out.print(spaceCount[l] + " " );
        System.out.println();
        temp = "";

        for(int j = 0; j < tempArray.length; j++){
            temp += tempArray[j];
            for(int k = 0; k < spaceCount[j]; k++)
                temp += ".";
        }
        result.set(i, temp);

    }

    temp = result.get(result.size() - 1);
    if(temp.length() < b){
        while(temp.length() < b)
            temp += ".";
    }
    else if(temp.length() > b)
        temp = temp.substring(0, b);
    result.set(result.size() - 1, temp);
    return result;          
}

public static int[] getSpaceCount(int freeSpace, int numOfStrings) {
    int size = numOfStrings - 1;
    int[] ret = new int[size + 1];
    if(size == 0){
        ret[0] = freeSpace;
    }
    else {
        for(int i =0; i < ret.length; i++) {
            if(size != 0){
                ret[i] = freeSpace % size == 0 ? freeSpace/size : freeSpace/(size + 1);
            }
            freeSpace = freeSpace - ret[i];
            size--;
        }
    }
    return ret;
}

public static void main(String[] args) {
    //ArrayList<String> a = new ArrayList<String>();

    System.out.println("#Enter ");
    String usrInput = BIO.getString();
    String[] items = usrInput.split("\\s+"); // Split where whitespace is encounterd using the RegEx
    ArrayList<String> newList = new ArrayList<String>(Arrays.asList(items));
    // ^Split input into ArrayList

    int b = 20; // Line length
    ArrayList<String> result = fullJustify(newList, b);

    for(int i =0; i < result.size(); i++) {
        System.out.println(result.get(i));
    }

    System.out.println(result);

}
}

首先,如果任何單詞的長度超過“ b”,我認為您的代碼將進入無限循環

關於此問題,您需要為最后一行創建不同的邏輯

temp = result.get(result.size() - 1);
if(temp.length() < b){
    while(temp.length() < b)
        temp += ".";
}
else if(temp.length() > b)
    temp = temp.substring(0, b);
result.set(result.size() - 1, temp);

您可以遠程處理這些部分,並將循環從result.size()-1更改為result.size(),這樣它將覆蓋所有行:

for(i = 0; i < result.size(); i++){

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM