Java-比较列表
我有一个用Java编写的程序,它将一个简单的字符串列表文件读入LinkedHashMap。然后,它获取第二个文件,该文件由两列组成,对于每一行,查看右侧术语是否与HashMap中的一个术语匹配。问题是它运行得很慢 下面是一个代码片段,它将第二个文件与HashMap术语进行比较:Java-比较列表,java,sorting,optimization,Java,Sorting,Optimization,我有一个用Java编写的程序,它将一个简单的字符串列表文件读入LinkedHashMap。然后,它获取第二个文件,该文件由两列组成,对于每一行,查看右侧术语是否与HashMap中的一个术语匹配。问题是它运行得很慢 下面是一个代码片段,它将第二个文件与HashMap术语进行比较: String output = ""; infile = new File("2columns.txt"); try { in = new BufferedReader(new
String output = "";
infile = new File("2columns.txt");
try {
in = new BufferedReader(new FileReader(infile));
} catch (FileNotFoundException e2) {
System.out.println("2columns.txt" + " not found");
}
try {
fw = new FileWriter("newfile.txt");
out = new PrintWriter(fw);
try {
String str = in.readLine();
while (str != null) {
StringTokenizer strtok = new StringTokenizer(str);
strtok.nextToken();
String strDest = strtok.nextToken();
System.out.println("Term = " + strDest);
//if (uniqList.contains(strDest)) {
if (uniqMap.get(strDest) != null) {
output += str + "\r\n";
System.out.println("Matched! Added: " + str);
}
str = in.readLine();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print(output);
从最初的ArrayList切换到LinkedHashMap,我的性能得到了提升,但这仍然需要很长时间。我能做些什么来加快速度呢?您的主要瓶颈可能是您正在为while循环的每个迭代重新创建一个StringTokenizer。将其移出循环可能会有很大帮助。通过将字符串定义移到while循环之外,可以获得较小的速度提升 最大的加速可能来自于使用。请参见下面的示例 哦,使用HashMap,而不是@Doug Ayers在上面的评论中所说的LinkedHashMap:) @MΓΓΓББLL关于评测您的代码的建议非常成功。结帐
最后一个想法是(我对此没有信心),如果您在最后一次性完成,那么向文件中写入也可能会更快。i、 e.将所有匹配项存储在某种类型的缓冲区中,一次完成写入。StringTokenizer是一个遗留类。建议的替换方法是字符串“拆分”方法 一些尝试可能会得到巩固。一次尝试可以获得多个捕获 使用HashMap而不是LinkedHashMap的建议是一个很好的建议。由于不需要维护列表结构,因此get和put的性能更快
“输出”字符串应该是StringBuilder,而不是字符串。这可能会有很大帮助。分析代码并找出瓶颈。优化最大的一个。Rinse and repeat.FYI,我只使用HashMap而不是LinkedHashMap,因为LinkedHashMap不仅维护“映射”,而且维护所有值的“链接列表”,以在迭代元素时保留插入顺序。除非您需要这种特殊的好处,否则我将改为HashMap。我同意@MΓΓББLL的观点,您的问题是缺少足够的信息来说明您的应用程序中的慢度发生在哪里。这些文件是否太大以至于你的应用程序正在将内存交换到磁盘?磁盘IO会很慢吗?现在运行当前程序需要多长时间?你需要它跑多快?在WHILE循环中实例化一个新的StringTokenizer;循环中的对象实例化代价高昂。您还在循环中使用System.out.println,如果文件足够大,打印可能会导致速度减慢。确定慢度的来源。@DougAyers那么什么是StringTokenizer的好替代品?@StickFigs-Doug没有建议您使用StringTokenizer的替代品。仔细阅读他的评论。马特·贝尔的建议也很重要。
Reader r = new BufferedReader(new FileReader(infile));
StreamTokenizer strtok = new StreamTokenizer(r);
String strDest ="";
while (strtok.nextToken() != StreamTokenizer.TT_EOF) {
strDest=strtok.sval; //strtok.toString() might be safer, but slower
strtok.nextToken();
System.out.println("Term = " + strtok.sval);
//if (uniqList.contains(strDest)) {
if (uniqMap.get(strtok.sval) != null) {
output += str + "\r\n";
System.out.println("Matched! Added: " + strDest +" "+ strtok.sval);
}
str = in.readLine();
}