私は2つの配列リストを持っています.
List<Date> a;
contains : 10/10/2014, 10/11/2016
List<Date> b;
contains : 10/10/2016
リストa
とb
をチェックして、b
にない値が返されるようにするにはどうすればよいですか? 10/10/2014
それらをSet
コレクションに変換し、それらに対して差集合演算を実行できます。
このような:
Set<Date> ad = new HashSet<Date>(a);
Set<Date> bd = new HashSet<Date>(b);
ad.removeAll(bd);
Bの欠損値のみを検索する場合は、次を実行できます。
List toReturn = new ArrayList(a);
toReturn.removeAll(b);
return toReturn;
いずれかのリストに存在する値を見つけたい場合は、上位コードを2回実行できます。変更されたリスト。
Java 8 Streamライブラリによるフィルターを使用できます
List<String> aList = Arrays.asList("l","e","t","'","s");
List<String> bList = Arrays.asList("g","o","e","s","t");
List<String> result = aList.stream().filter(aObject -> {
return bList.contains(aObject);
}).collect(Collectors.toList());
//or more reduced without curly braces and return
List<String> result2 = aList.stream().filter(aObject ->
!bList.contains(aObject)).collect(Collectors.toList());
System.out.println(result);
結果:
[e, t, s]
CollectionUtilsは Apache Commons Collections 4. から使用できます。
new ArrayList<>(CollectionUtils.subtract(a, b))
私は似ているように見えましたが、どちらかのリスト(2つのリストの一般的でない要素)の違いが欲しかったです:
私が持っているとしましょう:
List<String> oldKeys = Arrays.asList("key0","key1","key2","key5");
List<String> newKeys = Arrays.asList("key0","key2","key5", "key6");
そして、どのキーが追加され、どのキーが削除されたかを知りたい、つまり(key1、key6)を取得したかった
org.Apache.commons.collections.CollectionUtilsの使用
List<String> list = new ArrayList<>(CollectionUtils.disjunction(newKeys, oldKeys));
結果
[key1、key6]
List<String> l1 = new ArrayList<String>();
l1.add("Apple");
l1.add("orange");
l1.add("banana");
l1.add("strawberry");
List<String> l2 = new ArrayList<String>();
l2.add("Apple");
l2.add("orange");
System.out.println(l1);
System.out.println(l2);
for (String A: l2) {
if (l1.contains(A))
l1.remove(A);
}
System.out.println("output");
System.out.println(l1);
出力:
[Apple, orange, banana, strawberry]
[Apple, orange]
output
[banana, strawberry]
リストをセットに変換します。
// create an empty set
Set<T> set = new HashSet<>();
// Add each element of list into the set
for (T t : list)
set.add(t);
Set_1に存在する追加のアイテムを返すSets.difference(Set1, Set2)
を使用できます。
Set_2に存在する追加のアイテムを返すSets.difference(Set2, Set1)
を使用できます。
U.difference(lists)メソッドを underscore-Java ライブラリで呼び出すことができます。私はプロジェクトのメンテナーです。 実例
import com.github.underscore.U;
import Java.util.Arrays;
import Java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(1, 2);
List<Integer> list3 = U.difference(list1, list2);
System.out.println(list3);
// [3]
}
}
私は別の問題を探していましたが、これに出くわしたので、関連する問題に2つのマップを比較するという解決策を追加します。
// make a copy of the data
Map<String,String> a = new HashMap<String,String>(actual);
Map<String,String> e = new HashMap<String,String>(expected);
// check *every* expected value
for(Map.Entry<String, String> val : e.entrySet()){
// check for presence
if(!a.containsKey(val.getKey())){
System.out.println(String.format("Did not find expected value: %s", val.getKey()));
}
// check for equality
else{
if(0 != a.get(val.getKey()).compareTo(val.getValue())){
System.out.println(String.format("Value does not match expected: %s", val.getValue()));
}
// we have found the item, so remove it
// from future consideration. While it
// doesn't affect Java Maps, other types of sets
// may contain duplicates, this will flag those
// duplicates.
a.remove(val.getKey());
}
}
// check to see that we did not receive extra values
for(Map.Entry<String,String> val : a.entrySet()){
System.out.println(String.format("Found unexpected value: %s", val.getKey()));
}
他のソリューションと同じ原理で機能しますが、値が存在するだけでなく、同じ値が含まれていることも比較します。ほとんどの場合、2つのソース(従業員とマネージャーが入力した値が一致、顧客と企業の取引が一致、...など)からのデータを比較するときに、会計ソフトウェアでこれを使用しました