使用大集合或具有集合的等效地图是否合适?

L.M*_*ple 1 java data-structures

我有一些从companyId识别的不同公司收集的数据点,每个数据点的名称属性可能在一家公司或不同公司之间重复.问题是按名称属性对属于不同公司的所有数据点进行分组,这意味着如果公司已经存在于该组中,我们将忽略该数据点.

例如,数据点是:

companyId数据点名称
1 --------------------- A
1 --------------------- A
1 --------------------- B
2 --------------------- A
3-- -------------------乙

结果将是:

数据点名称组

A =================(1,A)(2,A)
B =================(1,B )(2,B)

我们可以看到公司1的第二个数据点A被忽略了.

据我所知,有两种方法可以进行重复数据删除工作.
1.建立一个Map<String(data point name), Set<Long(companyId)>>

Map<String, Set<Long>> dedup = new HashMap<>();
for(DataPoint dp : datapoints){
    String key = dp.getName();
    if(!dedup.contains(key)){
        dedup.put(key, new HashSet<Long>());
    }
    if(dedup.get(key).contains(dp.getCompanyId()){
        continue;
    }
    dedup.get(key).add(dp.getCompanyId());
}
Run Code Online (Sandbox Code Playgroud)

2.建立一个大的 Set<String>

Set<String> dedup;
for(DataPoint dp : datapoints){
    String key = dp.getName() + dp.getCompanyId();
    if(dedup.contains(key)){
        continue;
    }
    dedup.add(key);
}
Run Code Online (Sandbox Code Playgroud)

那么哪一个更好或更合适?

Ted*_*ddy 6

方法(1)更好,因为方法2类破坏了类型信息.

如果您想要经过充分测试的强大实施,并且有许多其他功能,那么现有的集合已经可用于这种情况.

番石榴:https://google.github.io/guava/releases/21.0/api/docs/com/google/common/collect/HashMultimap.html

Eclipse集合:https: //www.eclipse.org/collections/

如果您只想要一个简单的实现,您可以按照您的方法(1)自己完成.

结果将是这样的:

{
   "A": [1, 2],
   "B": [1, 2]
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢方法2的几个原因:

  1. 该方法不可靠.如果公司名称以数字结尾,那么您可能会有错误的重复数据删除.因此,您可能需要添加一个特殊字符,如下所示:<id>~<name>
  2. 如果您以后需要再考虑一个参数,它会变得更加混乱.你可能不得不这样做<id>~<name>~<pincode>,
  3. 在方法1中,如果实现哈希码并且等于仅基于companyId字段的哈希码,那么您可以直接放置公司bean.