Найдите дубликаты и перестановки в большом файле

У меня проблема, которую я пытался решить. Я пытаюсь найти количество пар записей (каждая строка - это одна запись), содержащих одинаковые символы.

Мой подход заключался в том, чтобы прочитать каждую строку, отсортировать ее, а затем сравнить с другими. Проблема в том, что я не получаю каждую пару дубликатов.

Вот мой код:

public static int countduplicates(String dbfilename) throws IOException {
    int counter = 0;

    Set<String> checker;
    BufferedReader list = new BufferedReader( new FileReader( dbfilename ) );
    String line;
    TreeMap<String,Integer> map  = new TreeMap<>();

    while ( (line = list.readLine()) != null )
    {
       String newline= sorted(line);

       System.out.println("Sorted: " + newline);

        if (!map.containsKey(newline))
        {
            map.put(newline, 0);
        }
        else {
            counter++;
            map.put(newline, 1);
        }
    }



    list.close();
    return counter;

}
}

Я понимаю, почему это не работает, потому что, например, если у меня есть входной файл, например:

BCDEFGH
ABACD
BDCEF
BDCAA
DBACA
DABACA
DABAC

Отсортировано я получу

BCDEFGH
AABCD
BCDEF
AABCD
AABCD (*)
AAABCD
AABCD

Но получит только результат 3 вместо 6, потому что (*) добавит только 1 к счетчику, когда он должен добавить 2. Может ли кто-нибудь из вас подсказать мне, как продолжить решение этой проблемы?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
61
3

Ответы 3

Если я правильно понимаю, вы можете просто подсчитать количество появлений каждой отсортированной записи с помощью карты:

(entry) -> n
=============
BCDEFGH -> 1
AABCD   -> 4
BCDEF   -> 1
AAABCD  -> 1

Теперь, чтобы найти количество пар для каждой записи, просто используйте формула

numbersOfPairs = (n*n - n) / 2

и все готово. Это даст вам следующие числа

(entry) -> numberOfPairs
=============
BCDEFGH -> 0
AABCD   -> 6
BCDEF   -> 0
AAABCD  -> 0

Если я правильно тебя понял, Во-первых, карта не допускает дублирования ключей. Я вижу в твоем коде

 else 
 {
 counter++;
 map.put(newline, 1);
 }

вы всегда устанавливаете счетчик записи равным единице, независимо от того, сколько раз она была там.

Например, трижды AABCD будет 1 на карте.

"But will only get the output 3 instead of 6 because (*) will only add 1 to counter when it should add 2. "

Это потому, что я упомянул выше, карта не допускает дублирования ключей.

BCDEFGH
AABCD 
BCDEF 
AABCD
AABCD 
AAABCD 
AABCD 

собирается быть

BCDEFGH -> 1 times
AABCD   -> 4 times
BCDEF   -> 1 times
AAABCD  -> 1 times

Вы можете узнать больше о карте здесь.

      newline = newline.substring(0, 
                                newline.indexOf(  "(" ) ).trim();

Попробуйте добавить строку выше перед условием if

        if (!map.containsKey(newline))
        {
               map.put(newline, 0);
        }
       else {
               counter++;
                map.put(newline, 1);
        }

Другие вопросы по теме