java - 封装的 For 循环导致问题

标签 java loops

尝试让我的输出如下所示:UserInputViaCommand: match1, match2

但它显示:UserInputViaCommand: match1, UserInputViaCommand: match2

我知道这是因为第二个 for 循环位于第一个 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());
}

最佳答案

一种简单的方法是检查缓冲区中是否已出现 ags[j] + ":",因为用户通过命令行输入的内容是不同的

所以你的内在 if 条件会是这样的:

if (nameFromFile.equalsIgnoreCase(result)) {
    if (!output.toString().contains(ags[j] + ":"))
        output.append(ags[j] + ":");
    output.append(" " + nameFile + ", ");

}

另一种可能性是循环的顺序可以颠倒,您首先通读用户参数,然后在外循环中设置output.append(ags[j] + ":");,然后寻找文件的开头来读取第二个参数(我将使用 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();
        }

人们可以承认寻找文件开头的效率低下,但如果它不是瓶颈,那么这是一个可行的选择。

关于java - 封装的 For 循环导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21167651/

相关文章:

java - 安卓 : Get day of the week from date?

java - 如何配置 logback 以跳过来自 org.package.* 的所有级别低于 WARN 的日志消息?

c 8个硬币组合代码

java - 使空对象不可变的任何标准模式或策略

java - 在具有动态内存大小的机器中设置 java 堆大小

循环内的 JavaScript 闭包 – 简单的实际示例

c++ - 如何使用带有参数/修改的 std::foreach

php - 如何使用 PHP 计算动态 HTML 表单输入数组?

java - 交互式图表和显示选项

php - Wordpress 查询帖子将每个项目包装在一个 div 而不是一个 li 中,并显示当前页面的后代