2

我正在使用 Google guava 格式化字符串并使用 BufferedWriter 将它们写入文本文件

import com.google.common.base.Strings;
import java.io.*;

public class Test {

    public static void main(String[] args) {
        File f = new File("MyFile.txt");
        String firstName = "STANLEY";
        String secondName = "GATUNGO";
        String thirdname = "MUNGAI";
        String location = "NAIROBI";
        String school = "STAREHE BOYS CENTRE";
        String yob= "1970";
        String marital = "MARIED";
        String texture = "LIGHT";

        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(f));
            if (!f.exists()) {
                f.createNewFile();
            }
           bw.write(Strings.padStart(firstName, 0, ' '));
           bw.write(Strings.padStart(secondName, 20, ' '));
           bw.write(Strings.padStart(thirdname, 20, ' '));
           bw.write(Strings.padStart(location, 20, ' '));
           bw.newLine();
           bw.write(Strings.padStart(school, 0, ' '));
           bw.write(Strings.padStart(yob, 20, ' '));
           bw.write(Strings.padStart(marital, 20, ' '));
           bw.write(Strings.padStart(texture, 20, ' '));


            bw.close();
        } catch (Exception asd) {
            System.out.println(asd);
        }
    }
}

我的输出是 我的输出

我需要输出

期望的输出

我从数据库和数据库接收字符串,上面的硬编码只是一个例子,我需要编写字符串,使第一个字符串的长度不影响第二个字符串的起始位置。我需要使用 Google Guava 从同一个位置开始以列方式编写它们。我也会欣赏例子。

4

4 回答 4

7

String.format

您可以简单地使用String.format()而不是Guava。它遵循此处描述的 C printf语法。我认为它可以满足您的需求。

String aVeryLongString="aaabbbcccdddeeefffggghh";
String aShortString="abc";
String anotherString="helloWorld";

String formattedString=String.format("%5.5s,%5.5s,%5.5s",aVeryLongString,aShortString,anotherString);

System.out.println(formattedString);

输出 :

aaabb,  abc,hello

如您所见,长字符串被剪断,短字符串被填充。

于 2013-04-19T07:36:50.393 回答
2

既然你已经在类路径上有了番石榴。我将向你展示我的想法,但这可能过于简单,需要做更多的工作,即使不是太多。

您需要始终知道一行中字符串的最大大小。我实际上只计算了一个:

    private static final class SortBylenght extends Ordering<String>{
        @Override
        public int compare(String left, String right) {
            return Ints.compare(left.length(), right.length());
        }
    }

然后计算最大值:

    ImmutableList<String> data = ImmutableList.of(firstName, school);
    SortBylenght sortBylenght = new SortBylenght();
    String maxString = sortBylenght.max(data);
    int maxSize = maxString.length();

然后打印:

  bw.write(Strings.padEnd(firstName, maxSize, ' '));
  for(int i=0;i<20;++i) bw.write(' ');
  //You need to pad the end here of course again like in the first row; 
  bw.write(secondName);
  bw.newLine();
  bw.write(Strings.padEnd(school, maxSize, ' '));
  for(int i=0;i<20;++i) bw.write(' ');
  //You need to pad the end here of course again like in the first row; 
  bw.write(yob);
于 2013-04-19T08:31:57.477 回答
2

我不确定你能做到这一点,尽管我没有使用过 Google Guava。这是一个建议,将文件写入 CSV,一个逗号分隔的文件。为此,只需将您的输出更改为 MyFile.csv,然后在您写入的每个值后添加一个逗号“,”。该文件可以在任何电子表格程序中打开,每个值都在自己的单元格中,因此解决方案将很简洁。

如果这不起作用,即,如果它必须是一个txt文件,那么这里是另一个想法。循环遍历您必须编写的每个字符串,找到最长的字符串,然后通过添加空格将您拥有的每个其他字符串调整到该长度。

我希望这有帮助!

于 2013-04-19T07:35:59.460 回答
1

使用padEnd(),不使用padStart()padStart()如果你想右对齐你的列。

于 2013-04-19T16:10:16.537 回答