现有的功能除了保留插入顺序外,还使用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可能有子节点 节点
答案 0 :(得分:2)
使用LinkedHashMap<CustomObject, CustomObject>
代替LinkedHashSet<CustomObject>
。
(这假设CustomObject.equals
和CustomObject.hashcode
使用您当前的“匹配”方法。否则使用带有外部“哈希”的第三方替代方案......)
该方法变为:
public CustomObject addCustomObject (CustomObject customObject) {
Map<CustomObject, Custom> child = parentRecord.get("customObjectName");
res = child.get(customObject);
if (res == null) {
child.put(customObject, customObject);
return customObject;
} else {
return res;
}
}
应该都是O(1)
。
答案 1 :(得分:0)
只需致电contains()
即可。它被指定为O(1)。
答案 2 :(得分:0)
LinkedHashMap
是Map
相当于LinkedHashSet
。如果将为您提供插入顺序遍历,保证密钥的唯一性,并且还可以在Map
中为您提供项目的恒定时间查找。这可能是你的另一种选择。
答案 3 :(得分:0)
从我理解的问题来看。 LinkedHashSet
适合您的要求。
但我认为你的equals() and hashcode()
中已经正确实施了CustomerObject
。
这样:
存储唯一值
Set为您提供该功能。
如果尝试添加
时已存在,则返回特定元素
使用equals和hashcode方法,只需执行
if (set.contains(obj)) "return" obj;
上面的“return”不是你方法中的return语句,意思是如果包含true,只需要把你要做的对象插入。因为它等于集合中的obj。 (不必迭代Set并获得equaled对象)
由于哈希表,contains(obj)
需要O(1)
。
保留插入顺序(如果可能)
linkedhashSet
基于linkedList
,因此保留了广告订单。