比较两个ArrayList的双向比较?

时间:2017-03-03 16:54:45

标签: java algorithm list arraylist

我有一个名为Task的课程,我无法触及,因为它是遗留代码,我有两个由ArrayList类组成的Task我需要比较。项目可以是任何顺序,也可以在ArrayList中有重复项。

比较两个具有对象的ArrayList并打印出缺少的元素的最佳方法是什么,这些元素在列表中不存在。下面的代码是正确有效的方法吗?我不能使用任何外部库。

我需要以双向比较来比较我的两个数组列表。

  • 如果数据在源中但不在实际中,则返回false并打印掉缺少的元素。
  • 如果数据是实际的但不在源中,则返回false并打印掉缺少的元素。

以下是我的代码:

  public static boolean compare(List<Task> source, List<Task> actual) {
    List<Task> matchedTasksList = new ArrayList<Task>();
    List<Task> differedTasksList = new ArrayList<Task>();

    List<Task> copyOfSource = new ArrayList<>(source);
    List<Task> copyOfActual = new ArrayList<>(actual);
    for (Task o : actual) {
      if (!copyOfSource.remove(o)) {
        differedTasksList.add(o);
        System.out.println("Task not present: " + o.toString());
        return false;
      } else {
        matchedTasksList.add(o);
      }
    }
    matchedTasksList.clear();
    for (Task o : source) {
      if (!copyOfActual.remove(o)) {
        differedTasksList.add(o);
        System.out.println("Task not present: " + o.toString());
        return false;
      } else {
        matchedTasksList.add(o);
      }
    }
    return (differedTasksList.size() == 0) ? true : false;
  }

2 个答案:

答案 0 :(得分:2)

public boolean compare(List<Task> source, List<Task> actual) {
    Set<Task> intersection = new HashSet<>(source);
    Set<Task> sourceDifference = new HashSet<>(source);
    Set<Task> actualDifference = new HashSet<>(actual);

    intersection.retainAll(actualDifference);

    sourceDifference.removeAll(intersection);
    for (Task t: sourceDifference) {
        System.out.println(String.format("Task %s not present in actual", t));
    }

    actualDifference.removeAll(intersection);
    for (Task t: actualDifference) {
        System.out.println(String.format("Task %s not present in source", t));
    }

    return sourceDifference.isEmpty() && actualDifference.isEmpty();
}

答案 1 :(得分:0)

似乎该函数只打印第一个缺少的元素,但据我所知,你需要打印所有缺少的元素并返回false?如果是这样尝试:

public boolean compare(List<Task> source, List<Task> actual) {
       List<Task> copyOfSource = new ArrayList<>(source);
       copyOfSource.removeAll(actual);
       copyOfSource.forEach(o -> System.out.println("Task not present:    "+o.toString()));
       return copyOfSource.isEmpty();
  }