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