在没有for循环的情况下,基于属性获取列表中的重复元素

时间:2013-06-28 14:43:17

标签: java

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

该列表具有以下提到的值

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 在一份单独的名单中。

如果没有迭代for或while循环,是否有任何api可用。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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;
}

答案 2 :(得分:1)

我相信你想使用HashSet

首先修改SomeType,以便equalshashCode仅使用第一个字段。我们假设您已将其称为field1

    如果两个对象“equals相等,
  • true只应返回field1
  • hashCode应该返回field1.hashCode

这会导致SomeType的值field1的{​​{1}}实例放在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 - 例如HashSet<ArrayList<SomeType>>

当然,如果我能正确理解你的问题......

答案 3 :(得分:0)

结帐Guava's 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对象列表的名称映射。