1. 程式人生 > >高效比較兩個list中不同的元素

高效比較兩個list中不同的元素

為知具體出處,望作者見諒!!

package com.syl.test;

import java.util.*;

/**
 * 獲取兩個List的不同元素(假設List自身不存在重複元素)
 * Created by syl on 2017/12/26 0026.
 */
public class TestCompareList {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new ArrayList<String>();
        for (int i = 0; i < 30000; i++) {
            list1.add("test" + i);
        }
        for (int i = 0; i < 80000; i++) {
            list2.add("test" + i * 2);
        }

        getDiffrent1(list1, list2);
        getDiffrent2(list1, list2);
        getDiffrent3(list1, list2);
        getDiffrent4(list1, list2);
    }

    // 方法1,兩層遍歷查詢,遍歷次數為list1.size()*list2.size(),有點蠢
    private static List<String> getDiffrent1(List<String> list1, List<String> list2) {
        // diff 存放不同的元素
        List<String> diff = new ArrayList<String>();
        // 開始查詢的時間,用於計時
        long start = System.currentTimeMillis();
        for (String str : list1) {
            if (!list2.contains(str)) {
                diff.add(str);
            }
        }
        // 計時
        System.out.println("方法1 耗時:" + (System.currentTimeMillis() - start) + " 毫秒");
        return diff;
    }

    // 方法2,兩層遍歷查詢,用retainAll()方法查詢,也很蠢,方法底層依舊是兩層遍歷
    private static List<String> getDiffrent2(List<String> list1, List<String> list2) {
        long start = System.currentTimeMillis();
        list1.retainAll(list2);// 返回值是boolean
        System.out.println("方法2 耗時:" + (System.currentTimeMillis() - start) + " 毫秒");
        return list1;
    }

    // 方法3,用Map存放List1和List2的元素作為key,value為其在List1和List2中出現的次數
    // 出現次數為1的即為不同元素,查詢次數為list1.size() + list2.size(),較方法1和2,是極大簡化
    private static List<String> getDiffrent3(List<String> list1, List<String> list2) {
        List<String> diff = new ArrayList<String>();
        long start = System.currentTimeMillis();
        Map<String, Integer> map = new HashMap<String, Integer>(list1.size() + list2.size());
        // 將List1元素放入Map,計數1
        for (String string : list1) {
            map.put(string, 1);
        }
        // 遍歷List2,在Map中查詢List2的元素,找到則計數+1;未找到則放入map,計數1
        for (String string : list2) {
            Integer count = map.get(string);
            if (count != null) {
                map.put(string, ++count);// 此處可優化,減少put次數,即為方法4
                continue;
            }
            map.put(string, 1);
        }
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                diff.add(entry.getKey());
            }
        }
        System.out.println("方法3 耗時:" + (System.currentTimeMillis() - start) + " 毫秒");
        return diff;
    }

    // 優化方法3,減少put次數
    private static List<String> getDiffrent4(List<String> list1, List<String> list2) {
        List<String> diff = new ArrayList<String>();
        long start = System.currentTimeMillis();
        Map<String, Integer> map = new HashMap<String, Integer>(list1.size() + list2.size());
        List<String> maxList = list1;
        List<String> minList = list2;
        if (list2.size() > list1.size()) {
            maxList = list2;
            minList = list1;
        }
        for (String string : maxList) {
            map.put(string, 1);
        }
        for (String string : minList) {
            Integer count = map.get(string);
            if (count != null) {
                map.put(string, ++count);
                continue;
            }
            map.put(string, 1);
        }
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                diff.add(entry.getKey());
            }
        }
        System.out.println("方法4 耗時:" + (System.currentTimeMillis() - start) + " 毫秒");
        return diff;

    }

}
方法四,基本上可以達到10000條資料穩定耗時6ms

相關推薦

高效比較list不同元素

為知具體出處,望作者見諒!! package com.syl.test; import java.util.*; /** * 獲取兩個List的不同元素(假設List自身不存在重複元素) * Created by syl on 2017/12/26 0026. *

一,比較陣列不同元素

1,兩個陣列,找出其中一個比另一個多的元素,例如輸入{"1","2","3"}    和{"1","4","5"},結果為{"2","3"} private Set<String>findScope(String [] oldArray, String [] n

高效篩選List不同元素

問題記錄: 開發過程中,需要把兩個List中不同的元素篩選出來,這兩個List的資料量都很大,如果按照一般的方法,分別去遍歷兩個List,然後分別對每一個元素做比較,時間消耗將會達到m*n,處理效率顯

php獲取陣列相同的元素(交集)以及比較陣列不同元素(差集)

(一)php獲取兩個陣列相同元素   array  array_intersect(array  $array1, array $array2, [, array $...])       array  array_int

Python程式碼比較列表元素是否相等,並且返回相等元素的列表索引

list1 = [1,2,'a','b',5,67,78,99,"ji"] list2 = [1,"a","b",2,87,34,67,"ji"] for i in range(len(list1)): for j in range(len(list2)):

1點兒優化:比較List是否有相同的String

一般寫法(雙層for迴圈+if語句)複雜 for(int i = 0; i < list2.size(); i++){ for(int j = 0; j < list3.siz

javalist儲存bean物件,找出其中某一屬性不同元素

在java中運用List集合儲存物件,如果想找到兩個list中不同的部分,可以用ArrayList的contains方法,遍歷每一個物件,判斷是否是相等的,如下: public stati

找出list不同元素、刪除list相同的物件

package com.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * *

時間殺手—for迴圈—如何找出list的相同元素

import numpy import datetime a = numpy.random.randint( 5,1000,100000 ) b = numpy.random startt1 = datetime.datetime.now() l11 = sorted(list(set(a)))

js比較陣列是否含有相同的元素,可去重,可刪除合併為新陣列

//做比較的兩個陣列 var array1 = ['a','b','c','d','e'];//陣列1 (所有人) var array2 = ['d','f','e','a','p'];//陣列2 (需要刪除的人) //臨時陣列存放 var tempArray1 = [];//臨時

js找出陣列不同元素

function arr(array,array2){     var arr3 = [];      for(鍵入陣列){           var stra = arra

setdiff:查詢向量不同元素 + 外則 去掉矩陣相同的東西

轉自:http://blog.csdn.net/tina_lulu_21/article/details/6273646設有向量A和B,要求出A和B中的不同元素,可使用matlab自帶的setdiff函式。語法為:    c = setdiff(A, B)  其計算公式為c

List去掉重複元素放在一個List去【Listsize值非常大】

/* * 思路: * 1.取得兩個list的相同元素:list.retainAll(E)方法 * 2.兩個list分別去掉相同的元素:list.removeAll(E); * 3.將剩下的兩個

【C語言】比較陣列是否有相同的元素

我們都知道,要判斷兩個陣列中是否有相同的元素,只需要兩層for迴圈,但是在for迴圈的內部,我們要注意什麼時候跳出迴圈,這個是非常重要的,不能一直輸出有,但是也不能既輸出有,又輸出沒有! 下面是第一種

提取個數組不同元素

ring arr 結果 () array cep 一個 [] clas 假設數組: string[] listA ={"1","2","3","4","5"}; string[] listB = {"1","4","5"}; 那麽,提

Java對數組的操作(三)—比較個數組元素是否同樣的最簡單方法

con data println test popu pan equal main spa 呵呵呵,實現Java比較兩個數組中的元素是否同樣的功能你是怎麽做的?看以下最簡單方法: import java.util.Arrays;

shell 比較文本不同

shellcomm命令使用場景:需要求兩個文件的共同的記錄列表或者只出現在第一個文件但不出現在第二個文件的記錄列表使用方法:一定要是先排序,即sort參  數: -1 顯示第一個文件中有第二個文件中沒有的列 -2 顯示第二個文件中有第一個文件中沒有的列 -3 顯示共有的列例子comm - 1

比較陣列的不同 java

// 返回不相同的元素 public static Set<String> getdiff(String[] a, String[] b){ Set<String> diff = new HashSet<String>(); //用

Java:比較物件全部屬性值是否相等

Java:比較兩個物件中全部屬性值是否相等 例如下述Java類: import java.io.Serializable; import java.util.List; public class Bean_Topology implements Serial

陣列提取相同元素陣列提取不同元素

兩個陣列提取相同元素 const getArrEqual = (arr1, arr2) => { let newArr = []; for (let i = 0; i < arr2.length; i++) { for (let j = 0; j <