散列2d数组中的项目,但仅限于一个索引

时间:2016-09-07 18:09:56

标签: java multidimensional-array hashset

所以,我有一个2d数组(实际上是一个列表列表),我需要压缩并删除任何重复项,但仅限于特定字段。

基本布局是匹配列表,每个匹配都有一个ID号和一个日期。我需要删除所有重复项,以便每个ID只出现一次。如果ID在匹配列表中多次出现,那么我想将匹配与最近的日期匹配。

我当前的解决方案让我获取匹配列表,将其添加到HashSet,然后将其转换回ArrayList。但是,所有这一切都是删除任何完全匹配重复项,如果它们具有不同的日期,仍然会使我出现多次相同的ID。

Set<Match> deDupedMatches = new HashSet<Match>();
deDupedMatches.addAll(originalListOfMatches);
List<Match> finalList = new ArrayList<Match>(deDupedMatches)

如果我的原始数据是

{(1, 1-1-1999),(1, 2-2-1999),(1, 1-1-1999),(2, 3-3-2000)}

然后我得到的是

{(1, 1-1-1999),(1, 2-2-1999),(2, 3-3-2000)}

但我真正想要的是一个能给我的解决方案

{(1, 2-2-1999),(2, 3-3-2000)}

我有一些模糊的想法,以相同的基本方式散列原始列表,但只使用ID。基本上我最终会得到&#34;桶和#34;基于我可以迭代的ID,以及任何具有多个匹配的存储桶,我可以选择正确的ID。让我感到困惑的是实际的哈希。我只是不确定如何以及如果我能按照我想的方式解决匹配问题。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您希望从列表中获取具有最新日期的不同ID。

因为您的匹配是一个类,所以不容易相互比较,因为Set没有查看字段。

我要解决这个问题的方法是使用HashMap,它允许链接不同的键和值。 键不能重复,值可以。
循环时我会做这样的事情:

if(map.putIfAbsent(match.getID(), match) != null &&     
    map.get(match.getID()).getDate() < match.getDate()){
    map.replace(match.getID(),match);
}
  • 那么它的作用就是循环你的比赛。
  • 如果该ID尚未存在,请将当前匹配的ID与其匹配。
  • .putIfAbsent返回旧值,如果该值不存在,则返回null。
  • 然后使用putIfAbsent(一石二鸟)检查地图中是否有一个项目。
  • 之后可以安全地比较两个日期(一个在地图中,另一个来自迭代 - &lt;是您的比较方法的考试)
  • 如果新的更新,则替换当前的匹配。
  • 最后为了获得你的名单你使用.getValues()

这将删除重复的ID,只留下最新的ID。

抱怨拼写错误或代码错误,这是在手机上完成的。如果评论中有任何错误,请通知我。

Java 7没有.putIfAbsent和.replace功能,但它们可以替代.contains和.put