我需要获得一个具有一个共同属性的重复对象列表。
该列表具有以下提到的值
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可用。
答案 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
,以便equals
和hashCode
仅使用第一个字段。我们假设您已将其称为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对象列表的名称映射。