高效的版画作品小问题

时间:2014-11-23 21:23:23

标签: java arrays

我一直在尝试将电话号码打印到文件中,只是想知道如何提高效率。现在,我的程序写28个电话号码所需的时间是12.5秒。我想知道是否有人可以指导我降低运行时间。这是我的打印方法:

<code removed>

正如你所看到的,我每次都必须重置扫描器,因为它给了我与我想要的相反的列表顺序。(我还需要帮助来解决这个问题)。例如:如果我将while循环更改为:

我得到了这个结果:

expected result:                              actual result: 
TEL: 2475463                                  247 : AHR 
2475463 : AIRLINE                             247 : AHS
247 : AHR                                     TEL: 2475463
247 : AHS                                     2475463 : AIRLINE
--------                                      --------                       

感谢您的帮助和理解。

2 个答案:

答案 0 :(得分:1)

阅读文件一次。将文字存储在List<String> words之类的

static List<String> getWords(String fileName) {
    List<String> al = new ArrayList<>();
    File file = new File(fileName);
    try (Scanner scanner = new Scanner(file);) {
        while (scanner.hasNext()) {
            String line = scanner.next();
            al.add(line);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return al;
}

static final List<String> words = getWords("word_list.txt");

然后,您的方法可以根据需要多次迭代words(并且无需重新读取words即可调用),这将解决您的性能问题。最后,我建议try-with-resources喜欢

public static void print(String str, String str1, String str2)
        throws java.io.IOException {

    // output file name
    try (FileWriter output = new FileWriter("result.txt", true);
            PrintWriter write = new PrintWriter(new BufferedWriter(output))) {

        write.println("TEL: " + str);
        for (String line : words) {
            if (isMatch(str, line))
                write.printf("%s : %s %n", str, line);
        }
        for (String line : words) {
            if (isMatch(str1, line))
                write.printf("%s : %s %n", str1, line);
        }
        for (String line : words) {
            if (isMatch(str2, line))
                write.printf("%s : %s %n", str2, line);
        }

        write.println("--------");
    }
}

修改

效率会降低(你要求记住更多),但你可以把它读成String(一次),然后使用Scanner(String)之类的

static String readFile(String fileName) {
    StringBuilder sb = new StringBuilder();
    File file = new File(fileName);
    try (Scanner scanner = new Scanner(file);) {
        while (scanner.hasNext()) {
            String line = scanner.next();
            sb.append(line).append(System.lineSeparator());
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return sb.toString();
}

static final String words = readFile("word_list.txt");

public static void print(String str, String str1, String str2)
        throws java.io.IOException {

    // output file name
    try (FileWriter output = new FileWriter("result.txt", true);
            PrintWriter write = new PrintWriter(new BufferedWriter(output))) {

        write.println("TEL: " + str);
        Scanner scanner = new Scanner(words);
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (isMatch(str, line))
                write.printf("%s : %s %n", str, line);
        }
        scanner = new Scanner(words);
        while (scanner.hasNextLine()) {
            String line1 = scanner.nextLine();
            if (isMatch(str1, line1))
                write.printf("%s : %s %n", str1, line1);
        }
        scanner = new Scanner(words);
        while (scanner.hasNextLine()) {
            String line2 = scanner.nextLine();
            if (isMatch(str2, line2))
                write.printf("%s : %s %n", str2, line2);
        }

        write.println("--------");
    }
}

效率较低,因为我们重建Scanner来解析每次测试的行。

答案 1 :(得分:0)

1)扫描文件一次!使用List存储行,完成后继续使用逻辑

2)因为你多次调用它来考虑“批量写入”(方法接受字符串列表而不仅仅是字符串,所以你只需要打开/关闭文件一次)