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



我有一个包含多个名称的文本文件(我列出了几个名称作为示例):

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();

有什么建议吗?

来自维基百科的名字列表

在我看来,你有两个错误。首先,你的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]);
}

这里有一个工作示例

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

此外,如果有尾随空格或逗号,此代码将崩溃,因为数组不包含 r+1 的索引。最后,&& line[r] != '.'什么都不做,因为其他两个部分就像白名单一样。如果字符是空格或逗号,则永远不会是句点。你的意思是让它line[r] == '.'吗?如果是这样,它还需要一个逻辑 OR 而不是逻辑 AND。

首字母大写的逻辑完全被破坏了。例如,条件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));
    }
}

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

正如我上面提到的

每次在循环输出中覆盖输出 = 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

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

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

最新更新