所以,我有一个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。让我感到困惑的是实际的哈希。我只是不确定如何以及如果我能按照我想的方式解决匹配问题。
答案 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。
抱怨拼写错误或代码错误,这是在手机上完成的。如果评论中有任何错误,请通知我。
Java 7没有.putIfAbsent和.replace功能,但它们可以替代.contains和.put