5 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個贊
我想比較兩個數(shù)組的對象并獲得一個不匹配的對象的新數(shù)組。這是: Array1 Array2 都包含 Object User 方法 getId 和 getUsername
for (int fw = 0; fw < tempOldArray.size(); fw++) {
for (int fi = 0; fi < tempArray.size(); fi++) {
if (tempOldArray.get(fw).getId() == tempArray.get(fi).getId()) {
match++;
break;
}
if(fi == (tempArray.size()-1)) {
nomatchfound++;
break;
}
}
}
Array1: {[1231, Peter], [2562, Jackson], [38987, Robert], [4765, William]}
Array2: {[2562, Jackson], [7584, Alfred], [38987, Robert], [8123, Mozart]}
Array3 should output {[1231, Peter], [4765, William]}
and Array4 should output {[7584, Alfred], [8123, Mozart]}
還詢問了如何從列表中檢索結(jié)果
{"peter", "trump", "donald", "jerry"}
{"peter", "donald", "lucas", "jerry"}
并輸出不匹配的

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個贊
如果您已經(jīng)在使用列表,只需使用以下內(nèi)容
list1.removeAll(list2)
為了進(jìn)一步優(yōu)化,如果您使用哈希集,您的刪除操作將變?yōu)?O(1),因此效率更高

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個贊
這只是離散數(shù)學(xué)的問題。檢查執(zhí)行情況removeAll():
public static void main(String[] args) {
List<String> first = Arrays.asList("peter", "trump", "donald", "jerry");
List<String> second = Arrays.asList("peter", "donald", "lucas", "jerry");
List<String> results = new ArrayList<>(first);
results.removeAll(second);
System.out.println(results.toString());
}
印刷:
[王牌]
這滿足了您對完整保留first和second列表并創(chuàng)建第三個列表以包含結(jié)果的要求。

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個贊
假設(shè)您正在使用的類稱為 Person,您必須將以下 equals 方法添加到類定義中
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!Person.class.isAssignableFrom(obj.getClass())) {
return false;
}
final Person other = (Person) obj;
if (this.id != other.id) {
return false;
}
return true;
}
在這種情況下,您可以簡單地使用像這樣的其他答案中指定的 removeAll 方法。
list1.removeAll(list2);

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個贊
顯示的其他答案List::removeAll
(例如來自 Cuga 的答案)是正確的,最適合簡單的情況。
Java流
我將展示使用 Java 流的更高級的方法。如果您的情況變得更加復(fù)雜,您可能想要使用這種方法。
定義您的兩個列表。用于List.of
實(shí)例化不可修改的列表已添加到 Java 9。
List < String > namesA = List.of ( "Peter" , "Paul" , "Mary" , "Wendy" , "Lisa" ); List < String > namesB = List.of ( "Peter" , "Paul" , "Jesse" , "Wendy" , "Lisa" );
從一個列表創(chuàng)建流。對于流中的每個元素,查看是否可以在另一個列表中找到該元素。
要查找所有匹配項,請使用
.filter ( namesB :: contains )
。要查找所有不匹配的項目(不同的元素),請使用:
.filter ( Predicate.not ( namesB :: contains ) )
這個Predicate.not
技巧是 Java 11 的新技巧,如這里所示。
將結(jié)果收集到一個新的List
.
List < String > distinct = namesA.stream () .filter ( Predicate.not ( namesB :: contains ) ) .collect ( Collectors.toList () );
轉(zhuǎn)儲到控制臺。
System.out.println ( "namesA: " + namesA ); System.out.println ( "namesB: " + namesB ); System.out.println ( "distinct: " + distinct );
結(jié)果。
namesA: [Peter, Paul, Mary, Wendy, Lisa]
namesB: [Peter, Paul, Jesse, Wendy, Lisa]
獨(dú)特的:[瑪麗]
添加回答
舉報