Алгоритм для сравнения нескольких таблиц exel
Задача стоит следующая: есть заполненная данными таблица exel (назову ее главной), содержимое этой таблицы нужно сравнить с еще тремя другими таблицами. Если значение из главной таблицы НЕ встречается ни в одной из трех других, то это значение нужно записать в новую таблицу с результатами. Если значение из главной таблицы есть хотя бы в одной из трех других, то такое значение никуда записывать не нужно. Таблицы объемные, количество значений везде разное.
У меня возникли трудности именно с самим алгоритмом сравнения и перебора данных. Есть мысли, как это можно эффективно реализовать?
Ответы (2 шт):
Предлагаю вам следующий алгоритм:
- Выбрать из каждой проверочной таблицы ключевое поле (столбец), объединить три эти диапазона, взять только уникальные ключи и отсортировать.
- Сделать сортировочный ключ для основной таблицы и пройтись по ней.
Используйте алгоритм Way2_NoIntegrity_Advanced.
А для начала нужно определиться, какими средствами будет реализовываться решение задачи. Это может повлиять на окончательный выбор алгоритма.
Не забываем про хэш-таблицы. Есть даже специальные алгоритмы для быстрого гарантированного подтверждения отсутствия искомого ключа. Один из них - Фильтр Блума. На SO есть вопросы и ответы про него.
Ваш вопрос сформулирован не очень конкретно, и приходится догадываться, что именно вы имеете в виду и в чем именно состоит ваше затруднение.
Если я догадался правильно, вопрос не о способе ввода данных из экселовского файла или вывода их в файл, а в том, как обработать данные после ввода, чтобы найти те данные, которые нужно записать в выходной файл.
Иными словами, у вас есть некий набор или множество значений (вы не указали, кстати, какого именно типа, а это может влиять на выбор подхода), назовем его A
, и несколько других наборов, назовем их B1, B2, ... Bn
. Вам нужно найти множество C
, которое содержит все элементы A
, кроме тех, которые содержатся хотя бы в одном из множеств B1, B2, ... Bn
.
На языке теории множеств такая операция записывается C = A - (B1 + B2 + .. + Bn)
. В Java
существует семейство классов предназначенных специально для реализации операций над множествами, это интерфейс Set
и реализующие его классы, в которых есть методы для добавления элементов и для объединения и вычитания множеств. Для нашей ситуации (порядок элементов не важен, быстродействие важно) лучше всего подходит класс HashSet
. Объединение множеств можно реализовать просто как чтение всех элементов из всех файлов, содержащих значения B1, B2, ... Bn
, в одно и то же множество B
, или же вычитание можно реализовать, как удаление читаемых элементов из заранее прочитанного A
.
Таким образом, решение вашей задачи на неком условном псевдокоде с элементами Java
можно записать так:
Set<НашТип> setA = new HashSet<>();
НашТип element;
while ((element = fileA.read()) != null) {
setA.add(element); // Добавляем элемент из первого файла
}
for (File fileB: ourFilesToSubtract) { // Все файлы, которые надо вычесть
while ((element = fileB.read()) != null) {
setA.remove(element); // Удаляем элемент, содержащийся в файле B
}
}
// Теперь setA содержит только те элементы из первого файла,
// которых нету в других. Запишем их в файл
for (НашТип element: setA) {
fileC.write(element)
}
Операции с файлами тут показаны условно, сделайте их так, как вам надо