在大文件中查找重复和排列

时间:2018-10-19 07:41:43

标签: java arrays duplicates

我有一个想要解决的问题。我想做的是找到包含相同字符的条目对的数量(每一行是一个条目)。

我的方法是读取每一行,对每一行进行排序,然后与其他行进行比较。问题是我没有得到每对重复的东西。

这是我的代码:

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到计数器上。你们中的任何人都可以给我关于如何继续解决此问题的任何提示吗?

3 个答案:

答案 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);
        }