it-swarm.dev

كيف يمكنني إرجاع الفرق بين قائمتين؟

لدي قائمتان للصفيف ، على سبيل المثال.

List<Date> a;
contains : 10/10/2014, 10/11/2016

List<Date> b;
contains : 10/10/2016

كيف يمكنني إجراء فحص بين القائمة a و b بحيث يتم إرجاع القيمة المفقودة في b؟ 10/10/2014

32
Rory Lester

يمكنك تحويلها إلى مجموعات Set ، وتنفيذ عملية فرق محدد عليها.

مثله:

Set<Date> ad = new HashSet<Date>(a);
Set<Date> bd = new HashSet<Date>(b);
ad.removeAll(bd);
45
Pablo Santa Cruz

إذا كنت تريد فقط البحث عن القيم المفقودة في b ، فيمكنك القيام بما يلي:

List toReturn = new ArrayList(a);
toReturn.removeAll(b);

return toReturn;

إذا كنت ترغب في معرفة القيم الموجودة في أي من القائمة ، يمكنك تنفيذ الرمز العلوي مرتين. مع القوائم التي تم تغييرها.

24
Denis Lukenich

يمكنك استخدام عامل التصفية حسب 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]
7
Milton Jacomini Neto

يمكنك استخدام CollectionUtils من Apache Commons Collections 4. :

new ArrayList<>(CollectionUtils.subtract(a, b))
7
contrapost

كنت أتشابه لكنني أردت الاختلاف في أي قائمة (عناصر غير شائعة بين القائمتين):

دعنا نقول لدي:

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]

6
justMe
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]
0
madhu sairam gunnam

أولا تحويل القائمة إلى مجموعات.

// create an empty set 
Set<T> set = new HashSet<>(); 

// Add each element of list into the set 
for (T t : list) 
    set.add(t); 

يمكنك استخدام Sets.difference(Set1, Set2) ، والتي تُرجع العناصر الإضافية الموجودة في Set1.
يمكنك استخدام Sets.difference(Set2, Set1) ، والتي تُرجع العناصر الإضافية الموجودة في Set2.

0
gs manisha

يمكنك استدعاء طريقة (قوائم) U.difference في الشرطة السفلية - جافا المكتبة. أنا مشرف المشروع. مثال حي

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]
    }
}
0
Valentyn Kolesnikov

كنت أبحث عن مشكلة مختلفة وشاهدت هذا ، لذلك سأضيف حل لمشكلة ذات صلة: مقارنة خريطتين.

    // 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()));
    }

إنه يعمل على نفس مبدأ الحلول الأخرى ولكنه يقارن ليس فقط أن القيم موجودة ، ولكنها تحتوي على نفس القيمة. غالبًا ما استخدمت هذا في البرامج المحاسبية عند مقارنة البيانات من مصدرين (تطابق الموظف والمدير مع القيم ؛ تطابق معاملات العملاء والشركات ؛ ... إلخ)

0
Jefferey Cave