【问题标题】:Capitalize letters in text file and save the changes - Java将文本文件中的字母大写并保存更改 - Java
【发布时间】:2023-03-22 03:01:01
【问题描述】:

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

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

【问题讨论】:

  • 调试它,你会发现出了什么问题。
  • 你每次在循环output = Character.toString(line[r]);中覆盖输出,所以它只包含1行。
  • 问题已通过其他答案的说明得到解决。感谢您的建议。

标签: java capitalize


【解决方案1】:

首字母大写的逻辑完全被打破了。 例如,条件line[r] == ' ' &amp;&amp; line[r] == ',' &amp;&amp; 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));
    }
}

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

【讨论】:

    【解决方案2】:

    line[r] == ' 'line[r] == ',' 之间的逻辑运算符需要是逻辑 OR || 而不是逻辑 AND &amp;&amp;,因为字符不能两者兼有。

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

    【讨论】:

      【解决方案3】:

      在我看来,您有两个错误。首先,您的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

      【讨论】:

      • 谢谢。就像你说的,我错过了+=。我做了所有其他更正并工作。谢谢!
      【解决方案4】:

      正如我上面提到的

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-03-27
          • 2019-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-17
          • 1970-01-01
          相关资源
          最近更新 更多