我有一个包含多个名称的文本文件(我列出了几个名称作为示例):
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));
}