Есть 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].
Также, желательно, использовать компаратор, который был использован при сортировке строк, размещенных в файлах, так как разные компараторы могут давать разный результат [Сортировка массивов русских символов и строк с участием буквы Ё].
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Довольно недавно начал изучать UnityВсё шло довольно ровно и хорошо, пока не случилось это
Исходные условия: - У нас есть класс измерительного прибора (MeasureDevice)MeasureDevice является сущностью
Есть библиотека на c++ и документация к нейВ целом с ней могу работать, но с некоторыми функциями проблема