我有一个想要解决的问题。我想做的是找到包含相同字符的条目对的数量(每一行是一个条目)。
我的方法是读取每一行,对每一行进行排序,然后与其他行进行比较。问题是我没有得到每对重复的东西。
这是我的代码:
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,因为(*)在计数器应加2时只会加1到计数器上。你们中的任何人都可以给我关于如何继续解决此问题的任何提示吗?
答案 0 :(得分:1)
如果我对它的理解正确,则可以使用地图简单地计算每个已排序条目的出现次数:
(entry) -> n
=============
BCDEFGH -> 1
AABCD -> 4
BCDEF -> 1
AAABCD -> 1
现在要查找每个条目的对数,只需使用formula
numbersOfPairs = (n*n - n) / 2
您已完成。这将为您提供以下数字
(entry) -> numberOfPairs
=============
BCDEFGH -> 0
AABCD -> 6
BCDEF -> 0
AAABCD -> 0
答案 1 :(得分:1)
如果我没看错, 首先,地图不允许重复的键。我在您的代码中看到了
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
您可以阅读有关地图here.
的更多信息答案 2 :(得分:0)
newline = newline.substring(0,
newline.indexOf( "(" ) ).trim();
尝试在if条件之前添加以上行
if (!map.containsKey(newline))
{
map.put(newline, 0);
}
else {
counter++;
map.put(newline, 1);
}