`

对两个文件进行比较并显示异同之开源解决(显示增加删除)

    博客分类:
  • java
阅读更多

由于公司项目需要对两个文件进行比较.(其实是数据库文本字段)

 

并且显示异同.

 

这里不是进行一个简单的比较.有一个文件就是

 

text1  1234

text2   012324

 

这两个文件并不是一个字段都不同.所以用一个一个 对比的办法是不可能的.因为text2 只是在 text1的基础上

 

在首字母上面增加了一个0 其他的没有改变...由于项目紧..没有自己实现..(自己实现也没有什么太好的思路)

 

这里就不讨论原理了..


http://www.incava.org/projects/java/java-diff/

 

文件下载

 

这个是开源的解决方案..在网络上面找到的.分享下.

 

实现很简单一共有两个类..两jar包都没有..直接把源文件放到工程下面进行测试..

 

demo也是很简单的.

 

Object[] a = new Object[] {
        "a",
        "b",
        "c",
        "d",
        "e"
    };

    Object[] b = new Object[] {
        "a",
        "x",
        "y",
        "b",
        "c",
        "j",
        "e",
    };

    Difference[] expected = new Difference[] {
        new Difference(1, -1,  1,  2),
        new Difference(3,  3,  5,  5),
    };

    Diff diff = new Diff(a, b);
    List diffOut = diff.diff();
 

要求输入的是一个Object[] 或是一个Collection的接口...

 

这个就不说你是怎么将你的文件转换成数组了.

 

		String strs = "123456";
		char[] strChars = strs.toCharArray();
		Object[] objs = new Object[strChars.length];
		for( int i  = 0; i < strChars.length; i ++){
			objs[i] = strChars[i];
		}

 下面看这个代码:

 

	public static void main(String[] args) {
		Object[] a = new Object[] { "a", "b", "c", "d", "e" };
		Object[] b = new Object[] { "a", "x", "y", "b", "c", "j", "e", };
		Diff diff = new Diff(a, b);
		List diffOut = diff.diff();
		for (int i = 0; i < diffOut.size(); i++) {
			Difference diffce = (Difference) diffOut.get(i);
			System.out.println(diffce);
		}

	}

 在main函数里面运行:

 

显示结果:

del: [1,-1] add: [1,2]
del: [3,3] add: [5,5]

 

其中difference是显示不同的类下面有4个属性:

 

/**
     * The point at which the deletion starts.
     */
    private int delStart = NONE;

    /**
     * The point at which the deletion ends.
     */
    private int delEnd = NONE;

    /**
     * The point at which the addition starts.
     */
    private int addStart = NONE;

    /**
     * The point at which the addition ends.
     */
    private int addEnd = NONE;

 当delEnd 或 addEnd 为 -1 的时候表示不进行操作.

 

 

		//abcde
		//01234
		//a<add>xy</add>cde
		//0     12      345
		//a<add>xy</add>c<del>d</del>e
		//0     12      3            4
		//a<add>xy</add>bc<del>d</del><add>j</add>e
		//0     12      34                 5      6
 

图示:<add>表示增加<del>表示删除.

del: [1,-1]  没有删除 add: [1,2]向a [1]中添加[1][2]
del: [3,3]  删除a中[3]  add: [5,5] 向a中添加[5]

 

[start,end]表示操作的数组下标从0开始.起始结束.

 

注:进行了del操作.数组长度减少.添加数组长度增加.

 

其中你自己调用.delStart,delEnd , addStart,addEnd就可以对数组进行标示了....

 

如果代码中的<add>换成其他的<b>标签就可以在html中.显示文件的不同了.

 

public static void main(String[] args) {
		Object[] a = new Object[] { "a", "b", "c", "d", "e" };
		Object[] b = new Object[] { "a", "x", "y", "b", "c", "j", "e" };
		Diff diff = new Diff(a, b);
		List diffOut = diff.diff();
		for (int i = 0; i < diffOut.size(); i++) {
			Difference diffce = (Difference) diffOut.get(i);
			System.out.println(diffce);
		}
		// abcde
		// 01234
		// a<add>xy</add>cde
		// 0 12 345
		// a<add>xy</add>c<del>d</del>e
		// 0 12 3 4
		// a<add>xy</add>bc<del>d</del><add>j</add>e
		// 0 12 34 5 6
		ArrayList list = new ArrayList();
		for (int i = 0; i < a.length; i++) {
			list.add(a[i]);
		}
		for (int i = 0; i < diffOut.size(); i++) {
			Difference tempDiff = (Difference) diffOut.get(i);
			int delStart = tempDiff.getDeletedStart();
			int delEnd = tempDiff.getDeletedEnd();
			int addStart = tempDiff.getAddedStart();
			int addEnd = tempDiff.getAddedEnd();
			if (delEnd != -1) {
				// delEnd == -1 就是不进行刪除...
				// 删除开始.
				for (int j = delStart; j <= delEnd; j++) {
					// 删除多个.
					list.remove(j);
					if (delStart != 0) {
						String temp = list.get(delStart - 1).toString();
						list.remove(delStart - 1);
						list
								.add(delStart - 1, temp + "<del>" + b[j]
										+ "</del>");
					} else {
						String temp = list.get(0).toString();
						list.remove(0);
						list.add(0, temp + "<del>" + b[j] + "</del>");
					}
					pirntList(list);
				}
			}

			if (addEnd != -1) {
				// addEnd == -1 就是不进行添加...
				// 下面添加的情况..
				for (int j = addStart; j <= addEnd; j++) {
					// 添加多个.
					if (addStart > list.size()) {
						list.add("<add>" + b[j] + "</add>");
					} else {
						list.add(addStart, "<add>" + b[j] + "</add>");
					}
					pirntList(list);
				}
			}
		}
		pirntList(list);
		// return buffer.toString();

	}

	public static void pirntList(List list) {
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			buffer.append(""+list.get(i));
		}
		System.out.println(buffer.toString());
	}
 

通过ArrayList 实现对数据的整理.用remove 删除.用add(index,object)进行添加.

 

结果:

 

del: [1,-1] add: [1,2]
del: [3,3] add: [5,5]
a<add>x</add>bcde
a<add>y</add><add>x</add>bcde
a<add>y</add><add>x</add><del>b</del>cde
a<add>y</add><add>x</add><del>b</del>cd<add>j</add>e
a<add>y</add><add>x</add><del>b</del>cd<add>j</add>e

 

最后显示了a变成b的全部过程.

 

 

 

 

 

 

 

 

1
0
分享到:
评论
2 楼 xifanlou 2008-10-23  
巧了,我也在做一个数据库数据比较的测试用例,刚好可以用到,谢谢了
1 楼 xifanlou 2008-10-23  
巧了,我也在做一个数据库数据比较的测试用例,刚好可以用到,谢谢了

相关推荐

    比较两个文件的差别的工具

    在IT行业中,有时候我们需要对比两个文件的差别,特别是在软件开发、文本编辑或代码审查的过程中。"比较文件的差别"是一个重要的任务,可以帮助我们找出文件之间的异同,从而进行精确的修改和更新。在这个场景下,...

    文件代码对比工具

    3. **KDiff3**:这是一款跨平台的对比工具,不仅能够对比两个文件,还能同时对比三个文件并进行三向合并。它的界面简洁,操作方便,适合代码开发和文档编辑。 4. **SourceTree**:虽然主要是一款Git图形化客户端,...

    代码对比工具专业.rar

    此类工具的主要作用在于,对两个文件或文件夹进行深入的对比分析,找出它们之间的异同,以便于程序员们理解代码的变更历史,解决冲突,或者进行版本控制。 1. **文件内容对比**:这是最基本的功能,可以针对两个...

    WinMerge(绿色)

    1. **文件比较**:WinMerge能够对两个文本文件进行逐行比较,高亮显示不同之处。无论是编程时查找代码差异,还是编辑文档时检查改动,它都能提供直观的界面和精确的比较结果。用户还可以选择忽略空格、制表符等细微...

    WinMerge-2.13.11

    1. 文件内容比较:WinMerge的核心功能是对比两个文件的内容,它可以精确到每一行甚至每一个字符,显示两份文档的差异,使用户能迅速定位并理解差异所在。 2. 文件夹比较:除了单个文件的对比,WinMerge还能比较整个...

    Compare_1_5_6_UNI_dll.zip

    Compare插件的出现,就解决了这个问题,让我们能够快速、准确地找出两个文件之间的异同。 首先,安装Compare插件非常简单。将解压后的“ComparePlugin.dll”文件复制到Notepad++的安装目录下的plugins子目录,然后...

    代码差异比对工具

    首先,代码差异比对(Code Diff)的基本原理是对两个文本文件进行逐行或逐字符的比较,找出其中的异同。通过高亮显示不同的部分,使得用户可以直观地看到变更的具体内容。比对结果通常会显示为三栏视图,左右两侧...

    Notepad++插件使用技巧,转自各方

    使用ComparePlugin,用户可以直观地看到两个文件的异同,有助于快速定位和解决问题。 下面,我们将详细介绍Notepad++插件的使用,以及ComparePlugin的一些关键功能: 1. **安装Notepad++插件**: - 用户可以通过...

    TXT内容对比工具

    工作原理上,TXT内容对比工具一般采用逐行或逐字符扫描的方式,通过算法计算两个文件的相似度和差异点。常见的比较算法包括最长公共子序列、编辑距离等,这些算法能高效地找出文件间的最小编辑操作次数,从而确定...

    程序对比 用于后期的测试

    它支持Windows操作系统,能够清晰地展示两个文件或文件夹之间的差异,并提供方便的合并功能,使得开发者可以快速定位并修复问题。 WinMerge的核心功能包括: 1. **文本对比**:它可以逐行比较两个文本文件的差异,...

    DOS 和 Linux 常用命令的对比

    标题 "DOS 和 Linux 常用命令的对比" 提供了一个关于两个操作系统命令行界面的比较主题。这篇博文可能探讨了 DOS(Disk Operating System)和 Linux 的命令行工具之间的相似性和差异性,帮助用户更好地理解和操作这...

    Eskil-开源

    在Eskil中,你可以方便地对比两个文件或目录,发现它们之间的异同。这对于开发人员来说极其有用,特别是在协同开发项目中,需要经常检查不同版本之间的更改。通过其直观的图形界面,Eskil可以清晰地呈现差异,使用户...

    unix and linux 培训资料

    - **比较文件**:比较两个文件的异同。 ##### 5.7 文件的备份与恢复工具 - **tar**:打包和解包文件。 - **cpio**:复制文件和目录。 ##### 5.8 文件的压缩和解压工具 - **compress/pack/gzip/pkzip**:对文件进行...

    浅谈桌面操作系统Linux与Windows的异同.pdf

    Linux与Windows作为两大主流操作系统,其设计哲学、架构理念及应用领域存在显著差异,同时也有一些相似之处。深入探究它们的特点,对于帮助用户做出更合适的选择有着重要意义。 首先,在系统安装方面,Linux与...

    linux技术文档

    查看两个文件或两份数据的异同。 49. **sed**:流编辑器。对文件或流进行模式匹配和替换操作。 50. **awk**:文本分析工具。用于处理和分析结构化的文本数据。 51. **tar -czvf** 和 `tar -xzvf`:创建和提取tar....

    pdfbox-1.7.0

    PDFBox可以比较两个PDF文档的差异,包括文字、图像、布局等方面的异同,这对于文档版本控制和审核非常有用。 在C#环境中,使用PDFBox-1.7.0.dll,开发者通常需要通过引用该DLL,然后调用其中的类和方法来实现上述...

    代码对比软件

    这类软件主要用于比较两个代码文件或代码库之间的差异,帮助用户找出它们之间的异同,从而进行有效的代码审查、合并冲突或者查找错误。在编程工作中,尤其是在团队协作中,代码对比软件扮演着至关重要的角色。 首先...

    hadoop运行环境配置步骤

    HDFS的核心由两个主要组件构成:NameNode和DataNode。NameNode作为主节点,负责管理文件系统的元数据,包括文件和数据块的映射关系。DataNodes则是数据存储节点,它们保存实际的数据块,并定期向NameNode发送心跳包...

    一些基础的 Linux 问题与讨论

    - **免费开源**:用户可以自由地获取源代码并对其进行修改。 - **稳定性高**:长期运行不容易崩溃。 - **安全性强**:由于其权限管理和隔离机制,相对更难被恶意软件攻击。 - **社区支持广泛**:有大量的开发者...

Global site tag (gtag.js) - Google Analytics