java 对比两个list获取增加的数据和减少的数据

因为在项目中用到了关于对比两个list中的数据获得输入元素和原数据中增加的和减少的数据,从而找到工具类如下:

public class CompareList {
/**
 * @param aList 本列表
 * @param bList 对照列表
 * @return 返回增加的元素组成的列表
 * @Description: 计算列表aList相对于bList的增加的情况,兼容任何类型元素的列表数据结构
 */
public static <E> List<E> getAddaListThanbList(List<E> aList, List<E> bList) {
    List<E> addList = new ArrayList<E>();
    for (int i = 0; i < aList.size(); i++) {
        if (!myListContains(bList, aList.get(i))) {
            addList.add(aList.get(i));
        }
    }
    return addList;
}

 /**
 * @param aList 本列表
 * @param bList 对照列表
 * @return 返回减少的元素组成的列表
 * @Description: 计算列表aList相对于bList的减少的情况,兼容任何类型元素的列表数据结构
 */
public static <E> List<E> getReduceaListThanbList(List<E> aList, List<E> bList) {
    List<E> reduceaList = new ArrayList<E>();
    for (int i = 0; i < bList.size(); i++) {
        if (!myListContains(aList, bList.get(i))) {
            reduceaList.add(bList.get(i));
        }
    }
    return reduceaList;
}


/**
 * @param sourceList 源列表
 * @param element    待判断的包含元素
 * @return 包含返回 true,不包含返回 false
 * @Description: 判断元素element是否是sourceList列表中的一个子元素
 */
private static <E> boolean myListContains(List<E> sourceList, E element) {
    if (sourceList == null || element == null) {
        return false;
    }
    if (sourceList.isEmpty()) {
        return false;
    }
    for (E tip : sourceList) {
        if (element.equals(tip)) {
            return true;
        }
    }
    return false;
}

/**
 * @param list
 * @return list
 * @Description: 去除list重复数据
 */
public static <E> List<E> cleanDisRepet(List<E> list) {
    HashSet h = new HashSet(list);
    list.clear();
    list.addAll(h);
    return list;
}
为了实现自动化对比两个文件夹下的同名大数据量文件,可以采用以下步骤: 1. 遍历两个文件夹,获取同名文件的路径和文件名。 2. 对于每个同名文件,使用Java-diff-utils库中的Diff类进行比较,得到文件的差异列表。 3. 遍历差异列表,分别处理添加、删除和修改操作,将它们分别记录到相应的输出文件中。 下面是一个示例代码,其中使用了Java8的Stream和Lambda表达式来简化代码并减少嵌套循环: ``` import difflib.*; import java.io.*; import java.nio.file.*; import java.util.*; public class FolderDiff { public static void main(String[] args) { String folder1 = "folder1"; String folder2 = "folder2"; String outputFolder = "diff_output"; String suffix = ".txt"; try { // 遍历两个文件夹,获取同名文件的路径和文件名 List<Path> files1 = Files.list(Paths.get(folder1)) .filter(p -> p.toString().endsWith(suffix)) .collect(Collectors.toList()); List<Path> files2 = Files.list(Paths.get(folder2)) .filter(p -> p.toString().endsWith(suffix)) .collect(Collectors.toList()); // 对于每个同名文件,使用Java-diff-utils库进行比较 for (Path file1 : files1) { Path file2 = files2.stream() .filter(p -> p.getFileName().equals(file1.getFileName())) .findFirst().orElse(null); if (file2 != null) { List<String> lines1 = Files.readAllLines(file1); List<String> lines2 = Files.readAllLines(file2); Patch<String> patch = DiffUtils.diff(lines1, lines2); // 遍历差异列表,将它们分别记录到相应的输出文件中 Path outputFile = Paths.get(outputFolder, file1.getFileName().toString() + ".diff"); Files.createDirectories(outputFile.getParent()); try (BufferedWriter writer = Files.newBufferedWriter(outputFile)) { for (Delta<String> delta : patch.getDeltas()) { switch (delta.getType()) { case CHANGE: writer.write("Modified lines in " + file1.getFileName() + ":"); break; case DELETE: writer.write("Deleted lines in " + file1.getFileName() + ":"); break; case INSERT: writer.write("Added lines in " + file1.getFileName() + ":"); break; } writer.newLine(); List<String> lines = delta.getRevised().getLines(); for (String line : lines) { writer.write(line); writer.newLine(); } } } } } } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例代码中,我们首先使用Files.list方法获取两个文件夹下所有以指定后缀结尾的文件。然后使用Stream和Lambda表达式过滤出同名文件,并逐个比较它们的差异。对于每个差异列表,我们遍历其中的Delta对象,并根据操作类型(CHANGE、DELETE或INSERT)将它们分别记录到相应的输出文件中。 这样,我们就成功地利用Java-diff-utils实现了自动化对比两个文件夹下的同名大数据量文件,并且减少了嵌套循环。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荼白z

感谢老板请我喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值