Как я могу вычислить различие между двумя ArrayLists?

Мое решение с использованием портов:

sudo ARCHFLAGS='-arch x86_64' gem install nokogiri -- --use-system-libraries

По умолчанию он будет компилироваться для x86_64 и i386, архитектура для i386 должна быть отключена, поскольку библиотеки зависимостей в порте предоставляют только x86_64 версия по умолчанию.

79
задан alex 19 March 2014 в 23:29
поделиться

5 ответов

В Java вы можете использовать метод removeAll интерфейса Collection .

// Create a couple ArrayList objects and populate them
// with some delicious fruits.
Collection firstList = new ArrayList() {{
    add("apple");
    add("orange");
}};

Collection secondList = new ArrayList() {{
    add("apple");
    add("orange");
    add("banana");
    add("strawberry");
}};

// Show the "before" lists
System.out.println("First List: " + firstList);
System.out.println("Second List: " + secondList);

// Remove all elements in firstList from secondList
secondList.removeAll(firstList);

// Show the "after" list
System.out.println("Result: " + secondList);

Приведенный выше код выдаст следующий результат:

First List: [apple, orange]
Second List: [apple, orange, banana, strawberry]
Result: [banana, strawberry]
188
ответ дан 24 November 2019 в 10:03
поделиться

У вас уже есть правильный ответ. А если вы хотите сделать более сложные и интересные операции между списками (коллекциями), используйте apache commons collections ( CollectionUtils ) Это позволяет вам создавать соединения / дизъюнкции, находить пересечения, проверять, является ли одна коллекция подмножеством другой, и другие приятные вещи.

20
ответ дан 24 November 2019 в 10:03
поделиться

РЕДАКТИРОВАТЬ: Исходный вопрос не указывал язык. Мой ответ на C #.

Вместо этого вы должны использовать HashSet для этой цели. Если вы должны использовать ArrayList, вы можете использовать следующие методы расширения:

var a = arrayListA.Cast<DateTime>();
var b = arrayListB.Cast<DateTime>();    
var c = b.Except(a);

var arrayListC = new ArrayList(c.ToArray());

using HashSet ...

var a = new HashSet<DateTime>(); // ...and fill it
var b = new HashSet<DateTime>(); // ...and fill it
b.ExceptWith(a); // removes from b items that are in a
9
ответ дан 24 November 2019 в 10:03
поделиться

Я думаю, вы говорите о C #. Если это так, вы можете попробовать этот

    ArrayList CompareArrayList(ArrayList a, ArrayList b)
    {
        ArrayList output = new ArrayList();
        for (int i = 0; i < a.Count; i++)
        {
            string str = (string)a[i];
            if (!b.Contains(str))
            {
                if(!output.Contains(str)) // check for dupes
                    output.Add(str);
            }
        }
        return output;
    }
2
ответ дан 24 November 2019 в 10:03
поделиться

Вы просто сравниваете строки.

Поместите значения в ArrayList A как ключи в HashTable A.
Поместите значения в ArrayList B как ключи в HashTable B.

Затем для каждого ключа в HashTable A удалите его из HashTable B, если он существует.

В HashTable B остались строки (ключи), которые не были значениями в ArrayList A.

Пример C # (3.0) добавлен в ответ на запрос кода:

List<string> listA = new List<string>{"2009-05-18","2009-05-19","2009-05-21'"};
List<string> listB = new List<string>{"2009-05-18","2009-05-18","2009-05-19","2009-05-19","2009-05-20","2009-05-21","2009-05-21","2009-05-22"};

HashSet<string> hashA = new HashSet<string>();
HashSet<string> hashB = new HashSet<string>();

foreach (string dateStrA in listA) hashA.Add(dateStrA);
foreach (string dateStrB in listB) hashB.Add(dateStrB);

foreach (string dateStrA in hashA)
{
    if (hashB.Contains(dateStrA)) hashB.Remove(dateStrA);
}

List<string> result = hashB.ToList<string>();
1
ответ дан 24 November 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: