Java 对于LinkedHashSet,检索元素最有效的替代方法是什么?
除了保留插入顺序外,还有一个现有功能使用LinkedHashSet存储一组唯一元素 如果LinkedHashSet中已经存在某个特定元素,则需要检索该元素。i、 e.当尝试添加元素时,该方法应检查该元素是否已存在,并返回现有元素。LinkedHashSet中最多可能有10000个元素 目前实现这一点的方法是在LinkedHashSet上使用迭代器Java 对于LinkedHashSet,检索元素最有效的替代方法是什么?,java,Java,除了保留插入顺序外,还有一个现有功能使用LinkedHashSet存储一组唯一元素 如果LinkedHashSet中已经存在某个特定元素,则需要检索该元素。i、 e.当尝试添加元素时,该方法应检查该元素是否已存在,并返回现有元素。LinkedHashSet中最多可能有10000个元素 目前实现这一点的方法是在LinkedHashSet上使用迭代器 Class CustomObject { String id; String name; CustomObject (Str
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;
}
}
类自定义对象{
字符串id;
字符串名;
CustomObject(字符串id、字符串名称){
this.id=id;
this.name=名称;
}
LinkedHashMap parentRecord=新LinkedHashMap(4);
.
.
.
公共CustomObject addCustomObject(CustomObject CustomObject)
//假设以下子节点不为null
Set child=parentRecord.get(“customObjectName”);
if(child.contains(customObject)){
迭代器it=child.Iterator();
while(it.hasNext()){
CustomObject节点=it.next();
if(node.getId().equals(customObject.getId())){
返回节点;
}
}
}
添加(自定义对象);
返回自定义对象;
}
}
是否有一种有效的替代数据结构方法
由于要添加的customObject已在集合中,因此返回 customObject本身是有意义的。然而,不知何故,它不起作用,因此被广泛使用 迭代器,因为我正在节点中构建节点。返回的customObject可能有子对象 节点
只需调用
contains()
。它被指定为O(1)。只需调用contains()
。它被指定为O(1)。ALinkedHashMap
是Map
的等价物LinkedHashSet
。If将为您提供插入顺序遍历,保证键的唯一性,并为您提供映射中项目的恒定时间查找。这可能是您的另一种选择。ALinkedHashMap
是Map
的等价物LinkedHashSet
。If将为您提供插入顺序遍历,保证键的唯一性,并为您提供映射中项目的恒定时间查找。这可能是您的另一种选择。使用LinkedHashMap
而不是LinkedHashSet
(这假设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;
}
}
public CustomObject addCustomObject(CustomObject-CustomObject){
Map child=parentRecord.get(“customObjectName”);
res=child.get(customObject);
如果(res==null){
child.put(customObject,customObject);
返回自定义对象;
}否则{
返回res;
}
}
所有这些都应该是O(1)
使用LinkedHashMap
而不是LinkedHashSet
(这假设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;
}
}
public CustomObject addCustomObject(CustomObject-CustomObject){
Map child=parentRecord.get(“customObjectName”);
res=child.get(customObject);
如果(res==null){
child.put(customObject,customObject);
返回自定义对象;
}否则{
返回res;
}
}
从我对这个问题的理解来看,这些都应该是O(1)
。LinkedHashSet
非常适合您的需求
但是我假设您已经在CustomerObject
中正确地实现了equals()和hashcode()
。
因此:
存储唯一值
Set为您提供了该功能
如果在尝试添加时已存在特定元素,则返回该元素
使用equals和hashcode方法,只需执行以下操作
if (set.contains(obj)) "return" obj;
上面的“return”不是方法中的return语句,意味着如果包含true,则只需获取要插入的对象。因为它等于集合中的obj。(不必迭代集合并获得相等的对象)
由于哈希表的缘故,contains(obj)
采用O(1)
保留插入顺序(如果可能)
linkedhashSet
基于linkedList
,因此保留插入顺序 从我对这个问题的理解来看。LinkedHashSet
非常适合您的需求
但是我假设您已经在CustomerObject
中正确地实现了equals()和hashcode()
。
因此:
存储唯一值
Set为您提供了该功能
如果在尝试添加时已存在特定元素,则返回该元素
使用equals和hashcode方法,只需执行以下操作
if (set.contains(obj)) "return" obj;
上面的“return”不是方法中的return语句,意味着如果包含true,则只需获取要插入的对象。因为它等于集合中的obj。(不必迭代集合并获得相等的对象)
由于哈希表的缘故,contains(obj)
采用O(1)
保留插入顺序(如果可能)
linkedhashSet
基于linkedList
,因此保留插入顺序 get()方法在LinkedHashSet上不可用!呃,哎呀,我的意思是contains()
!它应该返回实际的元素,而不仅仅是检查