1. 程式人生 > >java兩個list中儲存bean物件,找出其中某一屬性不同的元素

java兩個list中儲存bean物件,找出其中某一屬性不同的元素

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

public static void getUncontain(List<String> list1, List<String> list2){
        for(String str1 : list1){
            if(!list2.contains(str1)){
                // 打印出list2沒有b,d
                System.out
.println("ArrayList2裡沒有的是==>" + str1); } } for(String str2 : list2){ if(!list1.contains(str2)){ // 打印出list1沒有f,g System.out.println("ArrayList1裡沒有的是==>" + str2); } } }

但是List中儲存的是java中定義的bean物件呢?
如:

public class person {

    private int id;
    private String name;



    public person(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    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; } }

此時如果還用contains方法判斷由於是物件,每一次都不相同。

那該怎麼篩選出兩個list中不同的部分呢?

  • 1.這個方法比較笨,但是也是最容易想到的,就是用一個新的list,來記錄兩個list之間相同的地方,然後每個list將相同的部分去掉:
private static void getDifferentPart1(List<person> l1, List<person> l2) {
        List<person> newList=new ArrayList<>();
        List<person> diffeList=new ArrayList<>();
        for(person a : l1){
            for(person b:l2){
                if(b.getName().equals(a.getName())){
                    newList.add(a);//儲存相同的部分。
                }
            }
        }
        for(person a:l2){
            int flag=0;
            for (person person : newList) {
                if(person.getName().equals(a.getName())){
                    flag=1;//相同的部分
                }
            }
            if(flag==0){
                diffeList.add(a);
            }
        }
        for (person person : diffeList) {
            System.out.println("diffeList:"+person.toString());
        }
    }
  • 2.第二種方法新手不容易想到,就是重寫bean裡面的equals方法:
public class person {

    private int id;
    private String name;



    public person(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    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;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "id:"+id+","+"name:"+name+" ";
    }
    @Override
    public boolean equals(Object obj) {
        if(name.equals(((person)obj).getName()))
            return true;//這裡以name為判定標準。
        else {
            return false;
        }
    }
}

然後此時就可以用contains去比較物件:

private static void getDifferentPart2(List<person> l1, List<person> l2) {
        for(person a : l1){
            if(l2.contains(a)){
                System.out.println("ok!!!");
            }
        }

    }

其實你看contains方法原始碼的話,會發現它底層就是用equals方法實現的,

contains方法中直接呼叫indexOf方法,indexOf方法中採用equals方法判斷

/**
* Returns <tt>true</tt> if this list contains the specified element.
* More formally, returns <tt>true</tt> if and only if this list contains
* at least one element <tt>e</tt> such that
* <tt>(o==null ? e==null : o.equals(e))</tt>.
*
* @param o element whose presence in this list is to be tested
* @return <tt>true</tt> if this list contains the specified element
*/
public boolean contains(Object o) {
return indexOf(o) >= 0;
}

/**
* Returns the index of the first occurrence of the specified element
* in this list, or -1 if this list does not contain the element.
* More formally, returns the lowest index <tt>i</tt> such that
* <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>,
* or -1 if there is no such index.
*/
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}

相關推薦

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; /** * *

javaList去重並排序、如何快速地去掉List相同的部分

1:去重並排序 package twolist; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Has

javaList的交集並集差異集

public static void main(String[] args) { List list1 =new ArrayList(); list1.add("1111"); list1.add("2222"); list1.add("3333"); lis

時間殺手—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)))

Java list資料根據某個欄位合併

之前遇到一個需求,欄位是每小時那種(2018101208)。然後服務給我資料少了部分。然後我需要自已推算。然後補上沒有那些小時為單位的資料。這裡面也涉及到了自已設計出來資料list是全面的。所有的小時都有。然後把伺服器獲取list根據這個進行對比,補上伺服器沒有的小時數。兩個

list合併為列表物件

為了將兩個list資料對應起來方便前端進行處理。 需求:第一個圖片對應於第一個視訊作為視訊的封面。 兩個陣列:List< String > imgList, List< String > videoList 視訊多於圖片時不返回視訊 由於前期資料結構設

高效比較list不同元素

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

高效篩選List不同元素

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

java list 交集 並集 差集 去重複並集

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

java list的交併集快速算

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

JAVA工具類學習-java list 交集 並集 差集 去重複並集

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

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

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

字串相同的詞語返回一個分值

前言: 由於筆者工作的需求,給定一個字串,需要從一堆字串中找出與其最相似的字串,網路的一些演算法發現跟自己的需求不匹配,於是自己寫了一個,話不多說,請看下文。 目標: 給定兩個字串,能將兩個字串中相同詞語的相似度返回一個分值。 計分方式: 分值跟次數的個數有關,具體

Extjsp頁面共享設定物件屬性

父頁面  js 設定一個物件 var   role_tree = {globle_role:'all'}; 子頁面可以通過用 parent 關鍵字 設定 'click':function(nod

給定字符串數組二者不同元素

color void integer contain 遍歷 如果 nta 字符 style 題目描述:給定s = {"a","b","c","d","f","e","ab"}; s2 = {"a","ab"}; 求出s中不包含s2中的剩余元素。可以認為是 s-s2的結果。

136 Single Number 數組個數外其他數都出現只出現次的數

時間 body 算法 一次 整數 除了 給定一個整數數組 pub leetcode 給定一個整數數組,除了某個元素外其余元素均出現兩次。請找出這個只出現一次的元素。備註:你的算法應該是一個線性時間復雜度。 你可以不用額外空間來實現它嗎? 詳見:https://leetcod

Java演算法給定一個整數陣列其中個數相加等於目標值

給定一個整數陣列,找出其中兩個數相加等於目標值  例如:給定陣列及目標值 nums = [2,7,11,15] ,target = 9  因為nums[0] + nums[1] = 2 + 7 = 9  返回[0,1] /** * 使用輔助空間(使用雜湊表

C程式設計實現個數組只有個數不是成對出現個數

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> void Find(int *arr, int sz, int *p1, int *p2) { int num = 0; int i

輸入整數值n和m整數1到n之間的和為m的所有組合

/** * java實現,參考寫的 */ import java.util.ArrayList; import java.util.Scanner; public class Lx{ public static void main(String[] args) {