我有这种格式的对象列表:
class myObj {
private String identifier;
public myObj(String identifier){
this.identifier = identifier;
}
}
List<myObj> allobjects = new ArrayList<myObj>();
allobjects.add(new myObj("123"));
allobjects.add(new myObj("123"));
allobjects.add(new myObj("123"));
allobjects.add(new myObj("123"));
allobjects.add(new myObj("1234"));
allobjects.add(new myObj("12345"));
allobjects.add(new myObj("12"));
allobjects.add(new myObj("12"));
将重复对象提取到单独列表中的优雅方法是什么? 因此,在上面的示例中,返回包含两个列表的新List。第一个列表 包含:
new myObj("123");
new myObj("123");
new myObj("123");
new myObj("123");
第二个清单包含:
new myObj("12");
new myObj("12");
可能的解决方案是创建一个新对象:
List<List<myObj>> newList = new ArrayList<List<myObj>>
然后对于列表中的每个元素'allobjects'迭代每个元素,并且对于包含多个元素的每个元素,将其添加到列表中。然后在 当前元素的迭代结束时将新创建的列表添加到“newList”
这可以接受还是有其他解决方案?
答案 0 :(得分:2)
将equals和hashCode方法添加到myObj类,以便您可以将它们用作Map键:
class myObj {
private String identifier;
public myObj(String identifier){
this.identifier = identifier;
}
public int hashCode(){
return identifier.hashCode();
}
public boolean equals(Object o){
return identifier.equals(((myObj)o).identifier);
}
}
然后宣布一张地图:
Map<myObj, List<myObj>> map = new HashMap<myObj, List<MyObj>>()
并遍历原始列表。使用myObjs作为映射键,每次检索与myObj对应的列表。如果您是第一次遇到某个myObj,请不要忘记创建列表:
for(myObj obj : allobjects){
List<myObj> list = map.get(obj);
if(list == null){
list = new ArrayList<myObj>();
map.put(obj, list);
}
list.add(obj);
}
答案 1 :(得分:1)
根据需要实现equals然后你可以使用contains并通过检查其他集合进行迭代。
这是使用jdk8s'lambdas做的一种方法。
TransformService transformService = (inputs1, inputs2) -> {
Collection<String> results = new ArrayList<>();
for (String str : inputs1) {
if (inputs2.contains(str)) {
results.add(str);
}
}
return results;
};
Collection<String> inputs1 = new ArrayList<String>(2) {{
add("lemon");
add("cheese");
add("orange");
}};
Collection<String> inputs2 = new
ArrayList<String>(2) {{
add("apple");
add("random");
add("cheese");
}};
Collection<String> results = transformService.transform(inputs1, inputs2);
for (String result : results) {
System.out.println(result);
}
}
public interface TransformService {
Collection<String> transform(Collection<String> inputs1, Collection<String> inputs2);
}