0

我需要获取具有一个共同属性的重复对象列表。

该列表具有以下提到的值

SomeType someObject1 = new SomeType ("hello1", "1");
SomeType someObject2 = new SomeType ("hello1", "2");
SomeType someObject3 = new SomeType ("hello", "1");
SomeType someObject4 = new SomeType ("hello2", "2");
SomeType someObject5 = new SomeType ("hello2", "1");
SomeType someObject6 = new SomeType ("hello3", "2");
SomeType someObject7 = new SomeType ("hello4", "1");
SomeType someObject8 = new SomeType ("hello5", "2");

在这种情况下,我需要获取共享第一个参数的对象, someObject1,someObject2 ,someObject4,someObject5 在单独的列表中。

是否有任何 api 可用而无需迭代 for 或 while 循环。

4

4 回答 4

2

实现Object.equals(Object)Object.hashCode() 根据他们的合同,使得两个输入值确定相等和 hashCode。将所有对象放入 a 中,HashMap<SomeType, SomeType> 并使用它们自己作为键。然后,当您需要它们时,使用新对象作为键查询哈希映射,您将获得所需的对象。

于 2013-06-28T14:46:59.577 回答
1

我相信您想使用HashSet.

首先修改SomeType,以便两者equals都只hashCode使用第一个字段。假设您已将其称为field1

  • equalstrue仅当两个对象field1相等时才应返回
  • hashCode应该返回field1.hashCode

这将导致SomeType具有相同值 forfield1的实例被放入 的同一桶中HashSet

Set<SomeType> set = new HashSet<SomeType>()
set.add(new SomeType("field1", "foo"))
set.add(new SomeType("field1", "bar"))
// At this point, set only contains SomeType("field1", "bar")

如果您想保留所有实例,但要聚合它们,请使用HashSet另一个集合的 a - 例如 a HashSet<ArrayList<SomeType>>

当然,前提是我已经正确理解了您的问题...

于 2013-06-28T15:31:53.780 回答
1

据我了解,您想要所有重复项。一种简单的方法是使用不允许重复的 Set 集合并检查不成功的插入。为此,您需要覆盖对象中的 equals 方法。

public List<SomeObject> getDuplicates(List<SomeObject> objects) {
 Set<SomeObject> uniqueObjects = new HashSet<SomeObject>();
 List<SomeObject> duplicates = new ArrayList<SomeObject();

 for(SomeObject so : objects) {
  if(!uniqueObjects.add(so)) {
   duplicates.add(so);
  }
 }
 return duplicates;
}
于 2013-06-28T15:21:44.367 回答
0

查看Guava 的 Multimaps。然后你可以做这样的事情:

List<SomeType> someTypes = getSomeTypes();
Multimap<String, SomeType> someTypesByName = Multimaps.index(someTypes, new Function<SomeType, String>() {
    @Override
    public String apply(SomeType someType) {
        return someType.getName();
    }
}

生成的 Multimap someTypesByName 本质上是名称到具有该名称的 SomeType 对象列表的 Map。

于 2013-06-28T15:50:44.537 回答