0

我有一个具有不同 cdOption、cdVersion 和 cdDescription 的对象列表。

其中一些具有相同的 cdOption 但不同的 cdVersion,我需要获取具有不同 cdOption 的对象列表,因此我试图删除重复项,仅考虑 cdOption 字段。

到目前为止,我有这个:

List<Option> noDuplicateOptions = new ArrayList<Option>();
List<Option> options = resp.get(RESULT);

for (Option option : options) {
    for (Option noDuplicateOption : noDuplicateOptions) {
        if (option.getCdOption().equals(noDuplicateOption.getCdOption())) {
        noDuplicateOptions.add(option);
    }
}
}

return noDuplicateOptions;

但是有没有更快和优化的方法来做到这一点?

编辑:我使用的解决方案是覆盖 Option 中的 equals 方法,如下所示:

public boolean equals(Object obj) {
return obj instanceof Option && ((Option)obj).getCdOption() == cdOption;
}

那么我可以这样做:

List<Option> options = resp.get(RESULT);

Map<String, Option> map = new HashMap<String, Option>();
for (Option option : options) {
    map.put(option.getCdOption(), option);
}
options.clear();
options.addAll(map.values());

return options;
4

4 回答 4

2

程序执行永远不会到达此循环内部,因为 中没有元素noDuplicateOptions

for (Option noDuplicateOption : noDuplicateOptions) {
    // ...
}

我几乎可以肯定您的代码返回一个空列表。

于 2013-10-11T09:34:32.910 回答
1

使用哈希映射。在遍历所有选项的循环中,检查选项是否在 HashMap 中。如果不是,则将其添加到 HashMap 和一个新数组中,如果是,则不执行任何操作。

于 2013-10-11T09:40:02.620 回答
0

用于Set删除重复cdOption的 . 您需要添加Comparator的基础cdOption,例如:

 Set<Option> set=new TreeSet<>(new Comparator<Option>() {

        @Override
        public int compare( Option o1, Option o2) {
            return o1.getCdOption().compareTo(o2.getCdOption());
        }
 });
于 2013-10-11T09:42:43.250 回答
0

这个问题有点不妥。您说“我正在尝试获取具有不同 cdOption对象列表。但是,由于您有重复项(相对于 cdVersion),您只能获得代表列表或 cdOptions 列表(而不是object列表) .

这可能很微妙。但是这个对象列表中没有“the”。有许多可能的此类列表。

由于您要求更快的方法:处理此类情况的一种好方法通常是在构建列表时执行此操作,即您维护两个列表。一个包含所有选项,一个包含具有唯一 cdOptions 的选项子集....(例如,编写您自己的 List 扩展)。

于 2013-10-11T13:15:43.900 回答