大写文本文件中的字母并保存更改 - Java

时间:2017-11-08 21:07:39

标签: java capitalize

我有一个包含多个名字的文本文件(我列举的名称很少):

eden ahbez, American musician
bill bissett, Canadian poet
asha bandele, American writer
danah boyd, American scholar
e e cummings, American poet
mc chris, American rapper

我希望将每个单词或名称的每个首字母大写,包括逗号后面的那些字母。每当我尝试这样做时,输出只显示第一行并丢弃其他行,即使它没有大写字母。如何从同一个文件中读取,如上所述大写,并将更改保存在同一个文件中?因为在我的情况下,它只是读第一行。

我使用例如此代码来读取文件:

BufferedReader br1 = new BufferedReader(new FileReader("names.txt"));
    String phrase = "";
    String rline;

    while ((rline = br1.readLine()) != null) {
        phrase = rline;
        char[] line = phrase.toCharArray();
        for (r = 0; r < line.length; r++) {
            if (line[r] == ' ' && line[r] == ',' && line[r] != '.') {
                line[r + 1] = Character.toUpperCase(line[r + 1]);
            }
            output = Character.toString(line[r]);
            System.out.print(output);
        }
        System.out.println();

    }
    br1.close();

然后这样可以保存更改:

PrintWriter pw1 = new PrintWriter("names.txt");
pw1.println(output);
pw1.close();

有什么建议吗?

List of names from Wikipedia

5 个答案:

答案 0 :(得分:2)

line[r] == ' 'line[r] == ','之间的逻辑运算符需要是逻辑运算符或||而不是逻辑运算符&&,因为字符不能同时存在。

如果有一个尾随空格或逗号,这段代码也会崩溃,因为数组不会包含r+1的索引。最后&& line[r] != '.'没有做任何事情,因为其他两个部分就像白名单一样 - 如果角色是空格或逗号,它永远也不会是句号。你的意思是line[r] == '.'吗?如果是这样,它也需要逻辑OR而不是逻辑AND。

答案 1 :(得分:2)

在我看来,你有两个错误。首先,您的if要求不可能的事情(如果line[r]是空格,那么它也是逗号)。它应该是类似的东西:

if (line[r] == ' ' && r + 1 < line.length) {

其次,您始终使用output覆盖=的内容,而不是附加+=,因此该行应为:

output += Character.toString(line[r]);

如果你这样运行,你会注意到它丢失的东西,第一封信没有得到大写,所以你可以像这样添加一个额外的条件:

if (r == 0) {
    line[r] = Character.toUpperCase(line[r]);
}else if (line[r] == ' ' && r + 1 < line.length) {
    line[r + 1] = Character.toUpperCase(line[r + 1]);
}

这里有working example

答案 2 :(得分:1)

将首字母大写的逻辑完全打破。 例如,条件line[r] == ' ' && line[r] == ',' && line[r] != '.'永远不会成立。 这是解决这个问题的一种方法:

try (BufferedReader br = new BufferedReader(new FileReader("names.txt"))) {
    String line;

    while ((line = br.readLine()) != null) {
        char[] chars = line.toCharArray();
        for (int r = 0; r < chars.length; r++) {
            if (r == 0 || chars[r - 1] == ' ') {
                chars[r] = Character.toUpperCase(chars[r]);
            }
        }
        System.out.println(new String(chars));
    }
}

我还改变了输出机制以输出整个完成的行而不是逐个打印字符。

答案 3 :(得分:1)

正如我上面提到的

  

每次在循环输出中覆盖输出=   Character.toString(line [r]);,因此它只包含1行。

此外,您的大小写逻辑过于复杂和破碎,您可以从其他答案中看到。

所以,我这样做更容易:

    public static void main(String[] args) throws IOException {
        BufferedReader br1 = new BufferedReader(new FileReader("names.txt"));
        String rline;
        String output = "";

        while ((rline = br1.readLine()) != null) {
            String[] lineArr = rline.split(" ");

            for (String word : lineArr) {
                word = Character.toUpperCase(word.charAt(0)) + word.substring(1);
                output += word + " ";
            }

            output += "\n";
        }

        System.out.print(output);

        br1.close();
    }

输出:

Eden Ahbez, American Musician 
Bill Bissett, Canadian Poet 
Asha Bandele, American Writer 
Danah Boyd, American Scholar 
E E Cummings, American Poet 
Mc Chris, American Rapper

答案 4 :(得分:1)

org.apache.commons.lang中的WordUtils实现了许多管理文本的方法。这是一个例子:

public static void main(String[] args) {
        String phrase = "eden ahbez, American musician";
        System.out.println(WordUtils.capitalize(phrase));
}