如何将列表转换为唯一列表?

时间:2019-03-19 10:13:07

标签: java list

所以我有这两个类 ParentClass ChildClass ,并且我有以下数据(显示在jTable上):

Child Class       Parent Class
Child Class 1     Parent Class A
Child Class 2     Parent Class A
Child Class 3     Parent Class B
Child Class 4     Parent Class A
Child Class 3     Parent Class B
...               ... 

从这个 ChildClass视图,我试图获取所有父类并将其放入唯一列表/集合,因为我会通过说< strong> A级家长班的孩子班级总数,我正在这样做:

List<ParentClass> parents = new ArrayList<ParentClass>();
...
for(ChildClass child : childs){
    ParentClassDaoImpl parentClassDaoImpl = new ParentClassDaoImpl();
    ParentClass parent = parentClassDaoImpl.findParent(child.getParentId());
    if(parents.isEmpty()){
        parents.add(parent);
    }else{
        if(parents.indexOf(parent) == -1){//I have to check if this parent is already on my lists
            parents.add(parent);
        }
    }
}
...

我的问题是我总是得到重复的清单。我尝试了这个,但是得到了相同的输出:

...
if (!parents.contains(parent)) {
    parents.add(parent);
}
...

顺便说一下,我正在使用1.6 Java版本。

2 个答案:

答案 0 :(得分:2)

每次获得ParentClass的新对象时,为什么每次检查列表中是否存在该对象时,总会说该对象不存在,因为它与该对象的引用进行了比较。

用于维护对象的唯一列表,这些对象可以是覆盖equels()的方法,也可以只使用Map<ParentClass Id, ParentClass object>然后获取map.values()的方法。

答案 1 :(得分:2)

您可以管理Map<ParentClass, Set<ChildClass>>而不是列表?

地图的键将是父类,而值将是其子级的集合。

因此,您将遍历所有子项,对于每个子项,您只需调用类似map.get(parent).add(child);的名称 显然,在此之前,您将确保如果地图还不包含该父级,则可以使用空集初始化其子级集:

if (!map.containsKey(parent)) {
   map.put(parent, new HashSet());
}

最后,您可以遍历地图,并显示每个键的每个值集的大小...

HTH!