如何创建重复列表项列表?

时间:2012-12-05 14:00:01

标签: java list duplicates java-6

我有这种格式的对象列表:

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”

这可以接受还是有其他解决方案?

2 个答案:

答案 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);
    }