我一直在尝试将电话号码打印到文件中,只是想知道如何提高效率。现在,我的程序写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
-------- --------
感谢您的帮助和理解。
答案 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)因为你多次调用它来考虑“批量写入”(方法接受字符串列表而不仅仅是字符串,所以你只需要打开/关闭文件一次)