簡體   English   中英

從兩個數組列表中獲取唯一值

[英]Getting unique values from two arraylists with Collections

在堆棧上看了幾個答案,試圖借助這種比較2個ArrayList的簡單方法來做到這一點,但是卻無法找出問題所在。 為了總結不可見的代碼,我創建了兩個包含4個文件名的arraylist。 現在,我試圖獲取第三個arraylist,它將僅包含這兩個arraylist中的唯一值。 示例:第一數組列表-一,二,三,四個第二數組列表-一,三,五,七第三數組列表-二,四個,五,七(解決方案數組列表)這是代碼:

Collection<String> filesFromDir = new 
ArrayList(Arrays.asList(listOfFilenamesWithNoExtension));

        Collection<String> filesFromDB = new ArrayList(Arrays.asList(listOfFilesDB));

        List<String> listDir = new ArrayList<String>(filesFromDir);
        List<String> listDB = new ArrayList<String>(filesFromDB);

        listDir.removeAll(listDB);
        listDB.removeAll(listDir);

        System.out.println("Unique values: ");
        System.out.println(listDir);
        System.out.println(listDB);

在這種情況下,您不應使用removeAll:

listDir.removeAll(listDB);
listDB.removeAll(listDir);

因為一旦從listDir中刪除公共元素“ One”,listDB仍包含它,並且listDB.removeAll(listDir)不會將其刪除,因為listDir不包含它。 因此,您最終獲得了listDB及其原始元素。

一種可能的解決方案是遍歷列表並檢查元素是否公用。 盡管列表大小相同,但是您可以在同一循環中遍歷它們。

for(int i=0;i<listDB.size();i++){

  if(!listDB.contains(listDir.get(i)){ 
    resultList.add(listDir.get(i))
  }

  if(!listDir.contains(listDB.get(i)){ 
    resultList.add(listDB.get(i))
  }

}

做第一個列表的副本,並用它removeAll從第二個列表。 因為如果您從第一個列表中刪除重復項,然后將其與第二個列表進行比較,則所有值將是唯一的,因為重復項已從第一個列表中刪除。

Collection<String> listDir = new ArrayList(Arrays.asList("1","2", "3", "4", "5", "6", "7"));
Collection<String> listDirCopy = new ArrayList<>();
listDirCopy.addAll(listDir);
Collection<String> listDB = new ArrayList(Arrays.asList("1","3", "5", "7", "9"));
List<String> destinationList = new ArrayList<String>(); 

listDir.removeAll(listDB);
listDB.removeAll(listDirCopy);

destinationList.addAll(listDir);
destinationList.addAll(listDB);
System.out.println(destinationList);

您好,對不起我的初學者代碼,但是您可以制作第三個arraylist,循環遍歷第一個,然后在第一個數組列表中添加所有元素。 然后循環遍歷第二個列表,並在第三個數組列表中添加元素(如果不存在)或刪除(如果存在)。 看下面的代碼,希望對您有所幫助

public void sort(ArrayList<String> one, ArrayList<String> two){
        ArrayList<String> three = new ArrayList<>();

        three.addAll(one);
        for (int i = 0; i < two.size(); i++) {
            if (three.contains(two.get(i))){
                three.remove(two.get(i));
            }else {
                three.add(two.get(i));
            }
        }
    }

暫無
暫無

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

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