簡體   English   中英

如何在Java中比較兩個列表

[英]How to Compare two lists in java

我有兩個列表List listOne,List listTwo,並且我想比較兩個列表,如果兩者相同,則要將列表項添加到其他列表ol1中,否則添加到ol2中。

這里,ElementRangeIndex是一個包含一些字符串值的bean類。

比較兩個列表時,需要比較Bean中的每個字符串值。

我已經使用了以下代碼,但是由於兩個列表具有不同的對象,因此包含添加重復的值。

public static Map<Integer, List<ElementRangeIndex>> compareLists(List<ElementRangeIndex> listOne, List<ElementRangeIndex> listTwo) {
     boolean indicator = false;
     List<ElementRangeIndex> listOnes = new ArrayList<ElementRangeIndex>();

     List<ElementRangeIndex> listTwos = new ArrayList<ElementRangeIndex>();
     List<ElementRangeIndex> listThree = new ArrayList<ElementRangeIndex>();

     Map<Integer, List<ElementRangeIndex>> map = new HashMap<Integer, List<ElementRangeIndex>>();
    if (listOne!= null && listTwo!=null && listOne.size() == listTwo.size()) {

        for (ElementRangeIndex listTwoData : listTwo) {
            for (ElementRangeIndex listOneData : listOne) {
/* if (listOneData.getNamespaceUri().equals(listTwoData.getNamespaceUri())
                         && listOneData.getCollation().equals(listTwoData.getCollation())
                         && listOneData.getScalarType().equals(listTwoData.getScalarType())
                         && listOneData.getLocalname().equals(listTwoData.getLocalname())) {*/
                if ((listOneData.getNamespaceUri().hashCode()== listTwoData.getNamespaceUri().hashCode())
                        && (listOneData.getCollation().hashCode() == listTwoData.getCollation().hashCode())
                        && (listOneData.getScalarType().hashCode() == listTwoData.getScalarType().hashCode())
                        && (listOneData.getLocalname().hashCode() == listTwoData.getLocalname().hashCode())) {

                    listOnes.add(listOneData);

                    if(listTwos.contains(listOneData))
                        listTwos.remove(listOneData);

                    if(listTwos.contains(listTwoData))
                        listTwos.remove(listTwoData);

                    if(listThree.contains(listOneData))
                        listThree.remove(listOneData);

                    if(listThree.contains(listTwoData))
                        listThree.remove(listTwoData);


                }else{
                        if(!listOnes.contains(listOneData))
                        if(!listTwos.contains(listOneData))
                                listTwos.add(listOneData);
                    if(!listOnes.contains(listTwoData))
                        if(!listThree.contains(listTwoData))
                                listThree.add(listTwoData);

                }

            }
            }
        map.put(1,listOnes);
        map.put(2, listTwos);
        map.put(3, listThree);

        }
    return map;
}

我的目標是將類似的列表項添加到一個列表(listOnes)中,僅保留到其他列表(listTwos),而保留到其他列表(listThree)。

謝謝阿俊

如果您需要自己進行拆分,我可能會執行以下操作:

  1. 創建列表的副本並將其命名為leftOnly 這將僅包含列表一中的元素。

  2. 創建列表2的副本,並命名為rightOnly 這將僅包含列表二中的元素。

  3. 創建一個空列表intersectList ,其中將包含兩個列表中都存在的元素。

  4. 到目前為止, leftOnly可能包含太多元素,因此我們需要對其進行過濾。 為此,我們使用迭代器迭代每個元素,並檢查它是否也包含在rightOnly中。 如果是,我們從leftOnlyrightOnly刪除該元素,並將其添加到intersectList

為了加快該過程(在列表中containsremove列表是線性操作),可以將leftOnlyrightOny的類型設置為LinkedHashSet ,該類型允許更快的操作,但不允許重復(結果中使用重復會破壞整個邏輯)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM