2013-04-11 50 views
0

我已經閱讀了幾篇文章,但沒有得到確切的東西,我正在尋找。我知道如何爲此開發複雜的邏輯,這是針對Android的,由於可用的資源有限,我們不能期望設備上的處理過多。刪除兩個不同Arraylist之間的公共元素

我作爲

的Java Bean由五個領域的bean類對象的ArrayList - MyShares

  1. 文件名
  2. 文件路徑
  3. 檔案大小
  4. isShared
  5. 造物主

我有另一個只包含文件路徑的String的ArrayList。現在我想要的是刪除所有的通用元素之間的兩個arraylist意味着文件路徑在第一arraylist對象中的arraylist和文件路徑是類似的,然後我必須從兩個arraylist中刪除,但我不想要一個新的arraylist其中包含不常見的元素。但是我想讓我的兩個陣列表只有沒有他們的共同元素。

+1

你到目前爲止嘗試過什麼?給我們看一看 。 – 2013-04-11 12:58:16

+0

如何使用Set而不是List? – Egor 2013-04-11 12:58:43

+0

@Achintya Jain okkk只是等待 – 2013-04-11 12:58:52

回答

2

您可以使用StringMap到您的對象類型(我使用Obj爲了創建一個SSCCE)。

假設我們給出的清單objects和清單strings

步驟:

  1. 把所有objectsmap他們str變量作爲關鍵
  2. 獲取所有這些str變量使用map.keySet()
  3. 獲得了在objects的所有字符串,但不是在stringskeys.removeAll(strings)
  4. 獲取strings中的所有字符串,但不包含objectsstrings.removeAll(keys)
  5. 獲取對應於剩餘keys

請注意,您需要在步驟3和4小心了,因爲你需要備份的收藏品之一的objects

import java.util.*; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     new Test(); 
    } 

    public Test() { 
     List<Obj> objects = new ArrayList<>(); 
     objects.add(new Obj("a")); 
     objects.add(new Obj("b")); 
     objects.add(new Obj("c")); 

     List<String> strings = new ArrayList<>(); 
     strings.add("a"); 
     strings.add("d"); 
     strings.add("e"); 

     remove(objects, strings); 

     System.out.println(objects); 
     System.out.println(strings); 
    } 

    public void remove(List<Obj> objects, List<String> strings) { 
     Map<String, Obj> map = new HashMap<>(); 
     for (Obj object : objects) { 
      map.put(object.str, object); 
     } 

     Set<String> keys = map.keySet(); 
     List<String> oldStrings = new ArrayList<>(strings); 

     strings.removeAll(keys); 
     keys.removeAll(oldStrings); 

     objects.clear(); 
     for (String key: keys) { 
      objects.add(map.get(key)); 
     }  
    } 

    public class Obj { 
     public String str; 
     public Obj(String str) { 
      this.str = str; 
     } 
     @Override 
     public String toString() { 
      return str; 
     }  
    } 
} 

打印:

[b, c] 
[d, e] 
+0

gr8的工作!你能解釋一下代碼嗎? – 2013-04-11 13:48:44

+1

@MehulJoisar我更新了說明:-) – 2013-04-11 14:00:59

+0

謝謝.. .. !! – 2013-04-12 08:56:02

1

可以使用外部循環掃描Bean對象,並使用內部循環掃描文件路徑。

僞代碼:

for (Bean i in beans) { 
    for (String p in paths) { 
     if (i.path.equals(p)) { 
      beansToRemove.add(i); 
      pathsToRemove.add(p); 
     } 
    } 
} 
beans.removeAll(beansToRemove); 
paths.removeAll(pathsToRemove); 

我不知道如果我的額外的ArrayList跟蹤刪除的ArrayList違背您的問題或沒有,因爲原來的陣列仍然存在。 如果您在預先分類路徑上兩個數組和跟蹤的位置在每個區域(未窮舉搜索),你可以從N2提高它nlgn

1

粗糙Java代碼:

HashSet<String> commonKeys = new HashSet(); 
for (Share share : shares) { 
    commonKeys.add(share.filePath); 
} 
commonKeys.retainAll(filePaths); 
for (Iterator<Share> it = shares.iterator(); it.hasNext();) { 
    Share share = it.next(); 
    if (commonKeys.contains(share.filePath)) { 
     it.remove(); 
    } 
} 
filePaths.removeAll(commonKeys); 

這不會O(N),因爲removeArrayList是昂貴的。要獲得O(N)行爲,您需要創建新的ArrayList實例,或者將不想刪除的元素添加到臨時列表中,然後將clear()添加到原始列表中。

2

我將一些線索去你

假設你有兩個列表一個bean對象即myBeans,另一個用於文件路徑,即文件路徑

List<MyBean> beansToRemove = new ArrayList<MyBean>(); 
List<FilePath> filePathsToRemove = new ArrayList<FilePath>(); 

for(Bean myBean : myBeans) { 
    for(FilePath filePath : filePaths) { 
     if(myBean.getfilePath.equals(filePath.getFilePath())) { 
      beansToRemove.add(myBean); 
      filePathsToRemove.add(filePath); 
     } 
    } 
} 

//Now remove filePaths and beans if any 

for(Bean myBean : beansToRemove) { 
    myBeans.remove(myBean); 
} 

for(FilePath filePath : filePathsToRemove) { 
    filePaths.remove(filePath); 
} 

這只是一個流程,讓你清楚該做什麼;你可以根據你的需要進一步定製它。

相關問題