Есть 1.txt и 2.txt
в каждом есть около 10КК+ строк, но == длинны. Каким методом можно максимально быстро найти одинаковые строки из 1.txt во втором, то есть найти те строки из 2.txt, которые будут также в 1.txt
1.txt
1 2 3 4 5 6 7 (пробел типа энтера)
2.txt
9 0 9 9 9 1
значит во втором только одно совпадение есть "1" ?
Ответ
Если строки в файлах уже отсортированы, то задача значительно упрощается.
Воспользуемся итераторами:
var s1 = File.ReadLines("1.txt"); // Обратите внимание не ReadAllLines,
var s2 = File.ReadLines("2.txt"); // а ReadLines
using (var en1 = s1.GetEnumerator()) // Берем
using (var en2 = s2.GetEnumerator()) // итераторы
{
if (en1.MoveNext() && en2.MoveNext())
{
while (true)
{
var w1 = en1.Current; // Берем по
var w2 = en2.Current; // элементу
var comp = w1.CompareTo(w2);
if (comp == 0) // Нашли совпадение
Console.WriteLine(w1);
if (comp <= 0) // Выбираем какой из указателей сдвинуть
if (!en1.MoveNext()) break; // Выход если нечего больше брать
if (comp >= 0)
if (!en2.MoveNext()) break;
}
}
}
Тоже самое, но работаем с потоками явно:
using (var sr1 = new StreamReader("1.txt"))
using (var sr2 = new StreamReader("2.txt"))
{
var w1 = sr1.ReadLine();
var w2 = sr2.ReadLine();
while (w1 != null && w2 != null)
{
var comp = w1.CompareTo(w2);
if (comp == 0)
Console.WriteLine(w1);
if (comp <= 0)
w1 = sr1.ReadLine();
if (comp >= 0)
w2 = sr2.ReadLine();
}
}
Примечания:
При сравнении строк много нюансов и если CompareTo вернул 0, то есть ненулевая вероятность того, что Equals или == покажут что строки не равны [Албахари, C# 6.0 Справочник: Полное описание языка, стр. 292].
Также, желательно, использовать компаратор, который был использован при сортировке строк, размещенных в файлах, так как разные компараторы могут давать разный результат [Сортировка массивов русских символов и строк с участием буквы Ё].
Комментариев нет:
Отправить комментарий