1. 程式人生 > >list集合交集 並集 補集

list集合交集 並集 補集

前戲:

公司有個流程是這樣的,有四條流程,一條流程四個節點。在每個流程第四個節點操作完後,複製當前節點的“疑點”資料至下一流程的節點。本來這是個很簡單的功能,但是當上一條流程的節點資料更改後要同步到下一流程的首節點。原來的做法是刪除下一節點的所以資料,重新插入上一節點的全部資料。當資料很大時就會相當耗費資料資源,所以引出了這篇文章。

注:A與B分別代表整個

思路:listA(老的資料) 與 listB(新的資料),listA-listB的差集就是需要刪除的資料。listB-listA的差集就是需要新增資料庫的資料。

/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<User> listA = new ArrayList<User>();   // 原來的list
		List <User>listB = new ArrayList<User>();        // 新的list
		listA.removeAll(listB);
		
// 製造測試資料
		for(int i=0;i<6;i++){
			User u1 = new User(i,"張三"+i,String.valueOf(i));
			listA.add(u1);
			
			if(i<5){
				User u2 = new User("張三"+i,String.valueOf(i));
				listB.add(u2);
			}
			
		}
// 輸出原始資料
		System.out.println("-----------------------listA-------------------------");
		for(User u: listA){
			System.out.println(u.toString());
		}
		System.out.println("-----------------------listB-------------------------");
		for(User u: listB){
			System.out.println(u.toString());
		}
		
	
		
		// 新增資料庫的資料
		List<User> newList = new ArrayList<User>(); 
		newList.addAll(listB);
		newList.removeAll(listA);
		
// 刪除資料庫的資料
		List<User> delList = new ArrayList<User>(); 
		delList.addAll(listA);
		delList.removeAll(listB);
		
		System.out.println("-----------------------newlist-------------------------");
		for(User u: newList){
			System.out.println(u.toString());
		}
		System.out.println("-----------------------dellist-------------------------");
		for(User u: delList){
			System.out.println(u.toString());
		}
	}
}
輸出的效果沒有達到預期,後來翻看原始碼發現時

java.util
類 AbstractCollection<E>中的removeAll()方法中使用的contains()的問題。

    /**
     * {@inheritDoc}
     *
     * <p>This implementation iterates over this collection, checking each
     * element returned by the iterator in turn to see if it's contained
     * in the specified collection.  If it's so contained, it's removed from
     * this collection with the iterator's <tt>remove</tt> method.
     *
     * <p>Note that this implementation will throw an
     * <tt>UnsupportedOperationException</tt> if the iterator returned by the
     * <tt>iterator</tt> method does not implement the <tt>remove</tt> method
     * and this collection contains one or more elements in common with the
     * specified collection.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws ClassCastException            {@inheritDoc}
     * @throws NullPointerException          {@inheritDoc}
     *
     * @see #remove(Object)
     * @see #contains(Object)
     */
    public boolean removeAll(Collection<?> c) {
	boolean modified = false;
	Iterator<?> e = iterator();
	while (e.hasNext()) {
	    if (c.contains(e.next())) {
		e.remove();
		modified = true;
	    }
	}
	return modified;
    }
  /**
     * {@inheritDoc}
     *
     * <p>This implementation iterates over the elements in the collection,
     * checking each element in turn for equality with the specified element.
     *
     * @throws ClassCastException   {@inheritDoc}
     * @throws NullPointerException {@inheritDoc}
     */
    public boolean contains(Object o) {
	Iterator<E> e = iterator();
	if (o==null) {
	    while (e.hasNext())
		if (e.next()==null)
		    return true;
	} else {
	    while (e.hasNext())
		if (o.equals(e.next()))
		    return true;
	}
	return false;
    }



package com.bean;

public class User {

	private int id;
	private String name;
	private String age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public User(int id, String name, String age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public User(String name, String age) {
		super();
		this.name = name;
		this.age = age;
	}
	

	
    public boolean equals(Object obj) { 
        if((obj instanceof User) && obj!=null) { 
        	User u = (User)obj; 
        	//System.out.println("u.name:"+u.name+"this.name  "+this.name);
        	//System.out.println("u.age:"+u.age+"this.age  "+this.age);
            if((u.name.equals(this.name)) && (u.age.equals(this.age))) { 
            
                return true; 
            } 
        } 
        return false; 
    } 
	@Override
	public String toString() {
		return "User [age=" + age + ", id=" + id + ", name=" + name + "]";
	}
}

交併補:點選開啟連結

相關推薦

list集合交集 補集

前戲: 公司有個流程是這樣的,有四條流程,一條流程四個節點。在每個流程第四個節點操作完後,複製當前節點的“疑點”資料至下一流程的節點。本來這是個很簡單的功能,但是當上一條流程的節點資料更改後要同步到下一流程的首節點。原來的做法是刪除下一節點的所以資料,重新插入上一節點的全部

pandas DataFrame 交集補集

1.0 brief 詳細 技術分享 rop utf-8 col pri and 1.場景,對於colums都相同的dataframe做過濾的時候 例如: df1 = DataFrame([[‘a‘, 10, ‘男‘], [‘b‘, 11,

1063 Set Similarity (25 分)求集合交集比值

題目 Given two sets of integers, the similarity of the sets is defined to be N

STL 演算法vector/set集合-交集,,差,對稱差

針對這裡提及的四個集合運算必須特別注意: 1、第一個演算法需保證第一集合和第二集合有序,並從小到大排序,內部使用預設“<”操作符比較元素大小; 2、第二個演算法需保證第一集合和第二集合有序,排序方式參照Compare確定,內部使用Compare比較元素大小。 1 --

JS資料結構與演算法 —— 集合交集補集

概念:集合是由一組無序且唯一(每個元素只出現一次)的項組成的一組資料。其與數學裡的集合是同一個概念。在ES6裡已經引入了集合的資料結構概念——Set類。 分類:常見的有空集,並集,交集,差集。 應用場景:1)資料去重;2)用於儲存一些獨一無二的資料。 js實現一個集合 集合的特性

C# 取兩個集合交集

兩個 color pre str exce class 並集 blog span 交集:Intersect 並集:Union 差集:Except var A= new List() { 1, 2, 3, 4, 5, 6 }; var B= new List() { 3

java list 交集 去重複

package com; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void ma

集合去重,取交集差值

最好的方式是用set集合做並集,CollectionUtils封裝,union底部用hashmap取值存入hashSet中,去重 // 兩個集合合併成並去重 public void mergeSet(Set a,Set b){ // org.apache.commons.collections.

遞增有序的順序表表示集合,求解兩個集合交集 (c語言實現)

#include<stdio.h> #include<stdlib.h> #define max 100 typedef struct {     int elem[max];     int length; }List; void UnionLi

STL集合交集、差、對稱差

STL一共提供了四種set相關的演算法,分別是並集(union),交集(intersection),差集(difference),和對稱差集(symmetric difference)。 STL的這四個演算法所接受的set必須是有序區間,元素可以重複出現。即他們只能接受se

採用java8 lambda表示式 實現 java list 交集 去重複

採用java8 lambda表示式 實現java list 交集/並集/差集/去重並集 一般的javaList 交、並集採用簡單的 removeAll retainAll 等操作,不過這也破壞了原始的javaList物件,採用java8 lambda表示式流操

利用集合交集等圖示展現Mysql的多表的查詢結果

Mysql 多表查詢詳解 一.前言  二.示例 三.注意事項 一.前言  上篇講到Mysql中關鍵字執行的順序,只涉及了一張表;實際應用大部分情況下,查詢語句都會涉及到多張表格 : 1.1 多表連線有哪些分類? 1.2 針對這些分類有哪些連線方法? 1.3

java 兩個list 交集 去重複

List<String> list1 =new ArrayList<String>();list1.add("A");list1.add("B);List<String&

JAVA工具類學習-java 兩個list 交集 去重複

List<String> list1 =new ArrayList<String>();list1.add("A");list1.add("B);List<String> list2 =new ArrayList<String>

利用linux命令sort和uniq求兩個檔案的交集補集

給定兩個檔案 a.txt 和 b.txt ,每行是一個記錄(假設沒有重複),要求輸出兩集合的交集、並集、差集,輸出的結果只包括唯一項。交集定義為同時出現在兩個檔案中的記錄項,並集定義為出現在任何一個檔案中的記錄項,差集(A-B)定義為出現在A中而且不出現在B中的記錄,對稱

03.CSS選擇器-->交集選擇器

img ont meta tex es2017 nta color 學習 mage <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

Python 求兩個文本文件以行為單位的交集

cti %s txt readlines nio 兩個 open inter class Python 求兩個文本文件以行為單位的交集 並集 差集,來代碼: s1 = set(open(‘a.txt‘,‘r‘).readlines()) s2 = set(

Linux shell計算兩個檔案的交集 和差

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

2019秋招筆試題——(數組合)n個有序集合,時間複雜度O(n^2)

這是一道下午剛剛筆試的題目,百詞斬的秋招演算法工程師題目中的一個。 題目: n個有序集合的合併,我最低的時間複雜度只能降到O(n^2),水平不夠,不能再優化了。 先說說我的思想: 輸入要求已經說明了,我必須要先儲存這n個集合,包括集合的長度以及元素,顯然是一個二維陣列,第一維

集合(線性表)

#include<cstdio> #include<iostream> #define max 100 #define ok 1; using namespace std; typedef int elemtype; typedef int status; typedef