ArrayList thisDataList和dataList是两个包含大量数据的有序列表。 “ different”是ArrayList的数组,该数组将在第一行中包含thisDataList中但不在dataList中的数据,第二行中包含dataList中但在thisDataList中不存在的数据,我使用此方法小数据但不超过50Mo的文件,您能给出一个解决方案,使我使用“排序”列表更快的事实,做出相同的算法吗?
我正在使用Java 1.6
ArrayList<?>[] different = new ArrayList<?>[2];
ArrayList<String> tmp= new ArrayList<String>(thisDataList);
thisDataList.removeAll( dataList );
different[0]=new ArrayList<String>(thisDataList);
thisDataList= tmp;
dataList.removeAll( thisDataList );
different[1]=new ArrayList<String>(dataList);
答案 0 :(得分:0)
从列表的第一个元素开始。对于每个列表中当前索引处的元素,如果一个元素小于另一个元素,则该元素对于该列表是唯一的(因为列表已排序,而另一个列表再也找不到此较小的元素了),因此递增列出当前索引,然后将该元素添加为该列表的“额外”元素,并使用新的当前索引重复该操作。
参见下文:
public static void main(String[] args) throws JAXBException {
List<Integer> list1 = Arrays.asList(1, 2, 4, 6, 7, 8);
List<Integer> list2 = Arrays.asList(1, 3, 4, 5, 6, 9);
List<List<Integer>> listExtras = getExtraElementsOfLists(list1, list2);
List<Integer> list1Extras = listExtras.get(0);
List<Integer> list2Extras = listExtras.get(1);
System.out.println("List 1 extras:");
for (Integer i : list1Extras)
System.out.println(i);
System.out.println();
System.out.println("List 2 extras:");
for (Integer i : list2Extras)
System.out.println(i);
}
public static <T extends Comparable<T>> List<List<T>> getExtraElementsOfLists(List<T> list1,
List<T> list2) {
Collections.sort(list1);
Collections.sort(list2);
List<T> list1Extras = new ArrayList<>();
List<T> list2Extras = new ArrayList<>();
int index1 = 0;
int index2 = 0;
while (index1 < list1.size() && index2 < list2.size()) {
T value1 = list1.get(index1);
T value2 = list2.get(index2);
int delta = value1.compareTo(value2);
if (delta < 0) { // val1 < val2, list2 !contain val1
list1Extras.add(value1);
index1++;
} else if (delta > 0) { // val1 > val2, list1 !contain val2
list2Extras.add(value2);
index2++;
} else { // both have the same value
index1++;
index2++;
}
}
// whichever list still has elements, add them all to its extras
for (; index1 < list1.size(); index1++)
list1Extras.add(list1.get(index1));
for (; index2 < list2.size(); index2++)
list2Extras.add(list2.get(index2));
return Arrays.asList(list1Extras, list2Extras);
}
除排序外,其时间复杂度为linear
。