我有一个包含多个名字的文本文件(我列举的名称很少):
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();
有什么建议吗?
答案 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]);
}
答案 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));
}