Я бы сделал это следующим образом: - Разобрать оригинальный файл и сохранить все записи в новый файл.Используйте блоки данных фиксированной длины для записи записей в новый файл (например, длина самой длинной строки составляет 10 байт, длина блока 10 + x, x - дополнительная информация, которую вы хотите сохранить вдоль записей. Итак, 10-я записьв файле будет в байтовой позиции 10 * (10 + х)).Вам также необходимо знать количество записей для создания (чтобы размер файла не равнялся noOfEntries * blocklength, используйте RandomAccesFile и setLength, чтобы установить длину этого файла).- Теперь используйте алгоритм быстрой сортировки для сортировки записей в файле (моя идея состоит в том, чтобы в конце иметь отсортированный файл, что в конечном итоге делает вещи намного проще и быстрее. Хеширование теоретически тоже будет работать, но вам придется иметь дело с перестановкой дублирующихся записейзатем сгруппировать все дубликаты - на самом деле это не лучший выбор).- Разбор файла с теперь отсортированными записями.Сохраните указатель на запись о первом появлении записи.Увеличивайте количество дубликатов, пока не появится новая запись.Измените первую запись и добавьте эту дополнительную информацию, которую вы хотите иметь там, в новый файл «конечного результата».Продолжайте в том же духе со всеми оставшимися записями в отсортированном файле.
Выводы: я думаю, что это должно быть достаточно быстро и использовать разумное количество ресурсов.Тем не менее, это зависит от данных, которые у вас есть.Если у вас очень большое количество дубликатов, производительность быстрой сортировки снизится.Кроме того, если ваш самый длинный ввод данных будет длиннее среднего, это также приведет к потере файлового пространства.