【问题标题】:Detecting duplicates in a file [closed]检测文件中的重复项[关闭]
【发布时间】:2015-08-02 14:25:05
【问题描述】:

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

假设数据如下:

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 之间,可以使用哪些数据结构、函数等来减少执行时间?

感谢您的建议

【问题讨论】:

  • 问题 2“有哪些方法...”和问题 3 在这里不合适。他们太宽泛,太健谈了。你能edit你的问题,让它提出一个清晰、具体的问题,并得到正确答案吗?
  • 回应#2:您可以尝试使用哈希表来存储对条目的引用。这样,您可以简单地计算每个条目的哈希值,根据哈希值在哈希表中存储对相应条目的引用,并在与您计算的哈希值匹配的条目中查找每个条目的匹配项。这应该会大大减少计算时间,因为您不会尝试将每个条目与其他每个条目进行比较。 Hash functions in c++hash tables in c++
  • @DrewDormann 更新了问题,现在更清楚了吗?

标签: java c++ mysql database sqlite


【解决方案1】:

我会这样做。 创建一个包含这些成员(名字,姓氏,地址,...)的 Person 类 覆盖 toString() 以返回一个唯一的字符串,你还需要覆盖你的 person 类的 equals() 和 hashCode()。

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

那么您需要一个存储桶来保存这些对象,使用键值数据结构,如 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 希望这可以帮助 快乐编码

【讨论】:

  • 如果toString 方法有trimreplace 会有很大不同吗?
  • 您只是希望它基于所提到的那些属性是唯一的,无论对您有用。
猜你喜欢
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2010-12-08
相关资源
最近更新 更多