Начну с предположения, что наборы данных могут поместиться в памяти.Если нет, то вам нужно что-то более изощренное.
Я ссылаюсь ниже на «набор», где я думаю о чем-то похожем на C ++ std :: set.Я не знаю эквивалент Java, но любая схема хранения, которая позволяет быстрый поиск (дерево, хэш-таблица, что угодно).
Сравнение трех списков: L0, L1 и L2.
- Чтение L0, размещение каждого элемента в наборе: S0.
- Чтение L1, размещение элементов, которые соответствуютэлемент S0 в новый набор: S1 и отбрасывание других.
- Сброс S0.
- Считывание L2, сохранение элементов, соответствующих элементу S1, и отбрасывание других.
Обновление Просто понял, что вопрос был о "n" списках, а не трех.Однако расширение должно быть очевидным.(Надеюсь)
Обновление 2 Некоторый непроверенный код C ++ для иллюстрации алгоритма
#include <string>
#include <vector>
#include <set>
#include <cassert>
typedef std::vector<std::string> strlist_t;
strlist_t GetMatches(std::vector<strlist_t> vLists)
{
assert(vLists.size() > 1);
std::set<std::string> s0, s1;
std::set<std::string> *pOld = &s1;
std::set<std::string> *pNew = &s0;
// unconditionally load first list as "new"
s0.insert(vLists[0].begin(), vLists[0].end());
for (size_t i=1; i<vLists.size(); ++i)
{
//swap recently read "new" to "old" now for comparison with new list
std::swap(pOld, pNew);
pNew->clear();
// only keep new elements if they are matched in old list
for (size_t j=0; j<vLists[i].size(); ++j)
{
if (pOld->end() != pOld->find(vLists[i][j]))
{
// found match
pNew->insert(vLists[i][j]);
}
}
}
return strlist_t(pNew->begin(), pNew->end());
}