我正在尝试比较两个目录,每个目录有大约15k个文件,用于任何更改。 A是较新的版本,B必须更新。
我有两个大的校验和列表文件,称它们为A和B.A是较新的,B是较旧的版本。每个条目大约有15k个,看起来有点像:
<entry1 -filepath> <entry1 -checksum>
<entry2 -filepath> <entry2 -checksum>
<entry3 -filepath> <entry3 -checksum>
. .
. .
. .
条目按字母顺序列出。 需要比较两个文件以检查以下内容:
1.两个条目具有相同的文件路径但校验和不同
2.条目存在于文件A中但不存在于文件B中
3.条目存在于文件B中但不存在于文件A中。
我的提案算法:
int currentBLine = -1;
for(int index = 0; index < A.length; index++)
{
String newfilepath = A[index].getFilePath();
String newchecksum = A[index].getCheckSum();
for(; currentBLine < B.length; currentBLine++)
{
String oldfilepath = B[currentBLine].getFilePath();
String oldchecksum = B[currentBLine].getCheckSum();
if(filepath.compareTo(oldfilepath) > 0)
{
deleteFile(oldfilepath);
}
else if(filepath.compareTo(oldfilepath) == 0)
{
if(checksum.equals(oldchecksum)
{
currentBLine++;
break;
}
else
{
updateFile(oldfilepath, newfilepath);
break;
}
}
else
{
createFile(newfilepath);
break;
}
}
}
这是最有效的方法吗?我在这里做错了吗?
如果有人看到XY问题,请告诉我,我将填写背景信息。
答案 0 :(得分:1)
您拥有的程序(内部循环中带有break
的两个嵌套循环)实现了将两个已排序集合一起处理的标准算法。它类似于merging two sorted lists时使用的那个:创建两个索引,每个列表一个,循环直到两个列表都到达结尾。
您可以通过将其设置为单个循环而不是使用两个嵌套循环来将其带入其经典形式。在循环的每个步骤中,您执行的比较类似于您在三向if
语句中所获得的比较。唯一的区别是您不会使用break
,并且您需要检查A
和B
中的索引是否在其限制范围内。如果两个索引都在A
和B
限制范围内,请比较文件并检查您编码的方式。如果您到达A
的末尾,请删除B
文件。如果您到达B
的末尾,请复制A
文件。一旦你用完两个列表,循环就会结束。