[英]How to pass List of objects which again contains List of objects from one activity to another in Android
[英]How to return a new list that contains the objects in one list that are not found in another list
例如,列表1具有“ a,b,c”,列表2具有“ b,c,t”。 結果,應返回“ a”。
這是我的代碼:
public static <E> List<I> ReturnDifference(List<E> L1, List<E> L2)
{
List<E> L3 = new ArrayList<I>();
Iterator<E> iter1 = L1.iterator();
while (iter1.hasNext())
{
String s1 = (String)iter1.next();
Iterator<E> iter2 = L2.iterator();
while (iter2.hasNext())
{
String s2 = (String)iter2.next();
if (s1.compareTo(s2) != 0)
{
L3.add((E)s1);
}
}
}
return L3;
}
感謝你們對我的幫助 !
其他答案指出,有第三方庫將執行此類操作。 他們將以更少的精力來完成這項工作,並且比您的代碼可能會更高效。
但是,我假設這是一次“學習練習”。 因此,這是您代碼中的一些問題。
從最基本的開始:
使用“針對每個”語法:
Iterator<T> it = x.iterator(); while (it.hasNext()) { T t = it.next(); ... }
相當於
for (T t: x.iterator() { ... }
如果您使用不是字符串列表的任何參數調用ReturnDifference
,則對類型轉換的使用將中斷。
String s1 = (String)iter1.next();
應該
E s1 = iter1.next();
等等。
您不需要使用compareTo
。 請改用equals
。 這樣做的好處是可以處理未實現Comparable<E>
元素類型。
為什么返回一個參數類型為I
不是E
的列表?
大量樣式錯誤。 最重要的是:
最后,您的代碼中存在明顯的邏輯錯誤:
if (s1.compareTo(s2) != 0) {
L3.add((E)s1);
}
如果您查看該語句在代碼中的位置,然后考慮一下……顯然,您將多次向L3
添加相同的元素。
我將留給您找出解決方法。
1-從技術上講,編譯器允許您忽略此問題,但是>> can <<會使您陷入麻煩。 但是更重要的是,如果您要求經驗豐富的Java程序員閱讀嚴重忽略樣式約定的代碼,則他/她可能會直截了當地拒絕。
如何使用Apache Commons Substract方法?
您可以嘗試使用CollectionUtils中的交集()和減法()方法。
交集()方法為您提供了包含常見元素的集合,而減法()方法為您提供了所有不常見的元素。
無需for
循環或第三方庫。
內置的removeAll(Collection<?> c)
方法支持它。
List<String> list1 = Arrays.asList("a","b","c");
List<String> list2 = Arrays.asList("b","c","t");
List<String> result = new ArrayList<>(list1);
result.removeAll(list2);
System.out.println(result); // prints: [a]
如果由於list2
大而導致性能list2
,請首先將其轉換為Set
,因為removeAll()
方法是通過調用list2.contains(Object o)
:
result.removeAll(new HashSet<>(list2));
從技術上講,這會將性能從O(m⋅n)更改為O(m + n) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.