【发布时间】:2013-05-01 11:46:37
【问题描述】:
除了保留插入顺序之外,还有一个使用 LinkedHashSet 存储一组唯一元素的现有功能。
如果特定元素已存在于 LinkedHashSet 中,则需要检索该元素。即当尝试添加元素时,该方法应检查该元素是否已存在并返回现有元素。 LinkedHashSet 中最多可以有 10000 个元素。
目前实现这一点的方法是在 LinkedHashSet 上使用迭代器
Class CustomObject {
String id;
String name;
CustomObject (String id, String name) {
this.id = id;
this.name = name;
}
LinkedHashMap<String, LinkedHashSet<CustomObject>> parentRecord = new LinkedHashMap<String, LinkedHashSet<CustomObject>>(4);
.
.
.
public CustomObject addCustomObject (CustomObject customObject)
//Assume the following child node not to be null
Set<CustomObject> child = parentRecord.get("customObjectName");
if (child.contains(customObject)) {
Iterator<CustomObject> it = child.iterator();
while (it.hasNext()) {
CustomObject node = it.next();
if (node.getId().equals(customObject.getId())) {
return node;
}
}
}
child.add(customObject);
return customObject;
}
}
是否有一种有效的替代数据结构方式可以
存储唯一值
在尝试添加时返回特定元素(如果它已经存在)
保留插入顺序(如果可能)
由于被添加的customObject已经在集合中,返回 customObject 本身是有道理的。但是,这不知何故不起作用,因此去了 迭代器,因为我在节点内构建节点。返回的 customObject 可能有子对象 节点。
【问题讨论】:
-
语义上,如果
Set.contains(object)返回 true,则您已经拥有存储的元素(或等效实例) - 它是contains()的参数!因此,get()集合中的特定元素没有意义。 Map 似乎更适合您想要实现的目标,因为它可以将不可变标识符映射到实体的特定状态或实例。 -
(注意:上面的代码不会编译。
return child;语句返回的值类型错误,应该是return customObject;) -
很好,现在更正了代码;-)
-
我认为,根据我在代码中看到的内容,您不想检查
Set中是否已经存在对象,您想要检查Set中是否存在具有相同Id 的对象。那是对的吗?如果是这样,您目前得到的答案可能无法在所有情况下都正确执行。
标签: java