尝试将输出显示如下:UserInputViaCommand: match1, match2
但它显示:UserInputViaCommand: match1, UserInputViaCommand: match2
我知道这是因为第二个for循环位于第一个循环中,但我不确定是否要获得我想要的输出。
我的程序是从命令行运行的,如下所示:java program name1 name2 < names.txt
我读取文件并对其中的名称进行规范化,然后读取用户输入并执行相同操作,如果匹配则将其打印出来。
try {
InputReader = new BufferedReader(new InputStreamReader(System.in));
while ((nameFile = InputReader.readLine()) != null) {
//Normalising the input to find matches
nameFromFile = normalize(nameFile);
//Looping through each argument
for (int j = 0; j < ags.length; j++) {
// Appending text to the string builder
//Output.append(ags[j] + ":" + " ");
//Normalising the input to find matches
String result = normalize(ags[j]);
if (nameFromFile.equalsIgnoreCase(result)) {
Output.append(ags[j] + ":" + " " + nameFile + ", ");
//Output.append(ags[j] + ":" + " ");
//Output.append(nameFile + ", ");
}
}
}
System.out.println(Output);
}
catch (IOException e) {
System.out.println(e.getMessage());
}
答案 0 :(得分:0)
一个简单的方法就是使用已经出现在缓冲区中的ags[j] + ":"
检查,因为通过命令行输入的用户是不同的
所以你的内在条件会是这样的:
if (nameFromFile.equalsIgnoreCase(result)) {
if (!output.toString().contains(ags[j] + ":"))
output.append(ags[j] + ":");
output.append(" " + nameFile + ", ");
}
另一种可能性是循环&#39;顺序可以颠倒,你通过用户args首先在外部循环中设置output.append(ags[j] + ":");
,然后寻找文件的开头来读取第二个arg(我会使用RandomAccessFile
来轻松寻找文件的开头):
类似的东西:
try {
RandomAccessFile raf = new RandomAccessFile(new File(
"C://users//XX//desktop//names.txt"),
"rw");
for (int j = 0; j < args.length; j++) {
output.append(args[j] + ":");
while ((nameFile = raf.readLine()) != null) {
if (args[j].equalsIgnoreCase(nameFile)) {
output.append(" " + nameFile + ", ");
}
}
raf.seek(0);
}
System.out.println(output + "\r\n");
} catch (IOException e) {
e.printStackTrace();
}
人们可以争论寻求文件开头的低效率,但如果它不是瓶颈,那么这是一个可行的选择。