Найти дубликаты и перестановки в большом файле - PullRequest
0 голосов
/ 19 октября 2018

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

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

Вот мой код:

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

Сортировка Iполучит

BCDEFGH
AABCD
BCDEF
AABCD
AABCD (*)
AAABCD
AABCD

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

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

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

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

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

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

"Но получит только 3 вместо 6, потому что (*) добавит 1 к счетчику только тогда, когда он должен добавить 2."

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

BCDEFGH
AABCD 
BCDEF 
AABCD
AABCD 
AAABCD 
AABCD 

будет

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

Подробнее о карте можно прочитать здесь.

0 голосов
/ 19 октября 2018
      newline = newline.substring(0, 
                                newline.indexOf(  "(" ) ).trim();

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

        if (!map.containsKey(newline))
        {
               map.put(newline, 0);
        }
       else {
               counter++;
                map.put(newline, 1);
        }
0 голосов
/ 19 октября 2018

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

(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
...