5 回答
TA貢獻1818條經驗 獲得超8個贊
我想比較兩個數組的對象并獲得一個不匹配的對象的新數組。這是: 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]}
還詢問了如何從列表中檢索結果
{"peter", "trump", "donald", "jerry"}
{"peter", "donald", "lucas", "jerry"}
并輸出不匹配的
TA貢獻1878條經驗 獲得超4個贊
如果您已經在使用列表,只需使用以下內容
list1.removeAll(list2)
為了進一步優化,如果您使用哈希集,您的刪除操作將變為 O(1),因此效率更高
TA貢獻1895條經驗 獲得超7個贊
這只是離散數學的問題。檢查執行情況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列表并創建第三個列表以包含結果的要求。
TA貢獻1775條經驗 獲得超11個贊
假設您正在使用的類稱為 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貢獻1818條經驗 獲得超7個贊
顯示的其他答案List::removeAll(例如來自 Cuga 的答案)是正確的,最適合簡單的情況。
Java流
我將展示使用 Java 流的更高級的方法。如果您的情況變得更加復雜,您可能想要使用這種方法。
定義您的兩個列表。用于List.of實例化不可修改的列表已添加到 Java 9。
List < String > namesA = List.of ( "Peter" , "Paul" , "Mary" , "Wendy" , "Lisa" ); List < String > namesB = List.of ( "Peter" , "Paul" , "Jesse" , "Wendy" , "Lisa" );
從一個列表創建流。對于流中的每個元素,查看是否可以在另一個列表中找到該元素。
要查找所有匹配項,請使用
.filter ( namesB :: contains )。要查找所有不匹配的項目(不同的元素),請使用:
.filter ( Predicate.not ( namesB :: contains ) )
這個Predicate.not技巧是 Java 11 的新技巧,如這里所示。
將結果收集到一個新的List.
List < String > distinct = namesA.stream () .filter ( Predicate.not ( namesB :: contains ) ) .collect ( Collectors.toList () );
轉儲到控制臺。
System.out.println ( "namesA: " + namesA ); System.out.println ( "namesB: " + namesB ); System.out.println ( "distinct: " + distinct );
結果。
namesA: [Peter, Paul, Mary, Wendy, Lisa]
namesB: [Peter, Paul, Jesse, Wendy, Lisa]
獨特的:[瑪麗]
添加回答
舉報
