У меня проблема, которую я пытался решить. Я пытаюсь найти количество пар записей (каждая строка - это одна запись), содержащих одинаковые символы.
Мой подход заключался в том, чтобы прочитать каждую строку, отсортировать ее, а затем сравнить с другими. Проблема в том, что я не получаю каждую пару дубликатов.
Вот мой код:
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. Может ли кто-нибудь из вас подсказать мне, как продолжить решение этой проблемы?




Если я правильно понимаю, вы можете просто подсчитать количество появлений каждой отсортированной записи с помощью карты:
(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);
}