检测文件中的重复项

时间:2015-05-21 04:57:45

标签: java c++ mysql database sqlite

我正在尝试开发一个解析文件(即逗号,制表符分隔)并查找重复条目的应用程序。需要将重复的条目写入单独的文件,原始输入文件保持不变。我遇到的问题是我无法决定如何找到这些比赛?

让我们假设数据如下:

id,Firstname,Lastname,Address,Country
1,James,Michael,123 St,USA
2,James,Michae l,123 St,AU
3,Steve,Smith,12445,UK

*规则是只有当firstname,lastname,address匹配时才会将两个记录视为重复记录(请记住算法中不能考虑空格)

以下是我正在努力解决的问题

  1. 如果我使用类似sqlite的东西然后查询重复项而不是使用应用程序的本机语言(即c ++,java,python),它会有什么不同吗?
  2. 鉴于记录数量可能介于1000-1000000之间,可以使用哪些数据结构,函数等来减少执行时间?
  3. 感谢您的任何建议

1 个答案:

答案 0 :(得分:1)

继承人我将如何做到这一点。 创建一个包含这些成员的Person类(名字,姓氏,地址,......) 覆盖toString()以返回唯一字符串,您还需要为您的person类重写equals()和hashCode()。

@Override
public String toString(){
return firstname+lastname+address;
}

然后你需要一个桶来保存那些对象,使用键值数据结构lika a Map。

Map<String, Person>

然后你只需使用对象的toString作为键,将对象本身作为值。

处理存储桶时,可能是在一个循环中,你必须检查你的存储桶是否已包含该人物对象的副本?

    /*look for duplicates*/
    for (Person obj : allPersonsList) {
        if (uniquePersonMap.containsKey(obj.toString())) {
            Person previousPerson = uniquePersonMap
                      .get(obj.toString();
\\do something with previous or current person object
            }
            uniquePersonMap.put(obj.toString();

HashMap将足够快以根据其哈希值获取对象但是有5000000条记录,您可能会遇到一些性能问题或内存不足问题,因此您可能希望在任何给定时间内保持尽可能少的obj 希望这可以帮助 快乐的编码