很难从每一行获得第一个单词。有什么想法为什么输出空白文件?
该程序将以下文本作为输入:
abecedism word created from the initials of words in a phrase
ablaut variation in root vowel of words to change meaning
acronym word formed from initial letters of another word
acrophonic using a symbol for the initial sound of a thing
acroteleutic phrase or words at the end of a psalm
adversative word or phrase expressing opposition
目的是让结果看起来像这样:
abecedism
ablaut
acronym
acrophonic
acroteleutic
adversative
以下是目前的代码:
public static void main(String args[]) {
String fileNameOutput = "OutputFile.txt";
String fileName = "InputWords.txt";
Charset cs = Charset.defaultCharset();
try (BufferedReader bReader = Files.newBufferedReader(Paths.get(fileName), cs)) {
PrintWriter outputStream = new PrintWriter(fileNameOutput);
int lineNum = 0;
String line = null;
while ((line = bReader.readLine()) != null) {
lineNum++;
if (line.split(" ").length > 1) continue;
outputStream.println(line);
}
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:4)
问题在于:
if (line.split(" ").length > 1) continue;
每行有超过1个空格,所以代码为:
outputStream.println(line.split(" ")[0]);
永远不会执行,因为continue
会在迭代时直接跳到下一个,所以删除if (line.split(" ").length > 1) continue;
检查
修改强> 在打印消息中添加了line.split(“”)[0]以仅获取第一个单词
答案 1 :(得分:3)
if (line.split(" ").length > 1) continue;
检查行是否包含多个单词/标记,如果是,它会立即开始新的迭代,这意味着您在continue
之后跳过其余的代码,这会阻止您执行
outputStream.println(line);
并且由于文件中的每一行都有多个单词,因此您不会向结果文件添加任何内容。
使用Scanner类可以简化您的代码,允许我们使用next()
方法迭代单词/标记。
try (Scanner sc = new Scanner(new File(fileName));
PrintWriter outputStream = new PrintWriter(fileNameOutput);) {
while (sc.hasNextLine()) {
outputStream.println(sc.next());// write first word from line
sc.nextLine();// consume rest of text from that line
}
} catch (IOException e) {
e.printStackTrace();
}
注意:请勿在试用部分内调用close()
。如果发生outputStream.close();
PrintWriter outputStream
会导致extension String {
static func myfunc() -> String {
return "static"
}
func myfunc() -> String {
return "func"
}
}
let s3 = ""
print(s3.myfunc()) // output = "func"
print(String.myfunc()) // output = "static"
发生异常,则可能会产生很多问题。您应该将可关闭资源的声明作为try-with-resources的一部分。
答案 2 :(得分:1)
只需使用String#split(String)
将其拆分到遇到空间的地方。结果是一个数组。选择后者的第一个索引。
outputStream.println(line);
应替换为
outputStream.println(line.split(" ")[0]);
PS:为了实现这个目的,必须更改if (line.split(" ").length > 1) continue;
以允许包含多个单词的字符串。
答案 3 :(得分:1)
split
是不必要的,你基本上可以做到
while ((line = bReader.readLine()) != null) {
lineNum++;
int spaceIndex = line.indexOf(" ");
String firstWord = spaceIndex > -1 ? line.substring(0, spaceIndex) : line;
outputStream.println(firstWord );
}
如果该行为空,您可以添加另一项检查...
答案 4 :(得分:1)
就是这样
public static void main(String args[]){
String fileNameOutput = "OutputFile.txt";
String fileName = "InputWords.txt";
Charset cs = Charset.defaultCharset() ;
try (BufferedReader bReader = Files.newBufferedReader(Paths.get(fileName), cs)){
PrintWriter outputStream = new PrintWriter(fileNameOutput);
int lineNum = 0;
String line = null;
while ( (line = bReader.readLine() ) != null ) {
lineNum++;
outputStream.println(line.split(" ")[0]);
}
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 5 :(得分:1)
你需要使用find第一个空格的索引值 然后使用substring方法将字符串行从0切割为f
的索引答案 6 :(得分:1)