求两个集合的差集(大数据量)

版权声明: https://blog.csdn.net/Dongguabai/article/details/84282060

求交集可以使用retainAll()方法。

思路就是将两个集合都放入一个HashSet里面,再removeAll(),只要这两个集合不是完全相等,速度一般都可以接受,测试代码如下:

package com.list;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;

/**
 * @author Dongguabai
 * @date 2018/11/19 22:50
 */
public class Test {

    public static void main(String[] args) throws IOException {
        int COUNT = 200000;
        //doSth(COUNT);

        //   List<String> list1 = Files.readLines(new File("C:\\Users\\Dongguabai\\Desktop\\a.txt"), Charset.defaultCharset());
       // List<String> list2 = Files.readLines(new File("C:\\Users\\Dongguabai\\Desktop\\b.txt"), Charset.defaultCharset());

        List<String> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        for (int i = 0; i < COUNT; i++) {
            //if (i <= 160000) {
                String s = String.valueOf(Math.random() * 11);
                list1.add(s);
                list2.add(s);
            /*}else {
                list1.add(String.valueOf(Math.random() * 11));
                list2.add(String.valueOf(Math.random() * 11));
            }*/
        }

        HashSet<String> set = new HashSet<>(COUNT * 2);
        set.addAll(list1);
        set.addAll(list2);
        long startTime = System.currentTimeMillis();
        set.removeAll(list1);
        long endTime = System.currentTimeMillis();

        System.out.println("程序运行时间:" + (endTime - startTime) + "ms");

    }

    private static void doSth(int COUNT) {
        List<String> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        for (int i = 0; i < COUNT; i++) {
            String s = String.valueOf(Math.random() * 11);
            if (COUNT <= 20000) {
                list1.add(s);
                list2.add(s);
            } else {
                list1.add(String.valueOf(new Random().nextInt() * 11));
                list2.add(String.valueOf(new Random().nextInt() * 11));
            }
        }


        list1.add("a");
        HashSet<String> set = new HashSet<>(COUNT * 200);
        set.addAll(list1);
        set.addAll(list2);
        set.removeAll(list1);
    }
}

大数据量的差集也可以使用Redis的sdiff操作。

猜你喜欢

转载自blog.csdn.net/Dongguabai/article/details/84282060