Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于LinkedHashSet,检索元素最有效的替代方法是什么?_Java - Fatal编程技术网

Java 对于LinkedHashSet,检索元素最有效的替代方法是什么?

Java 对于LinkedHashSet,检索元素最有效的替代方法是什么?,java,Java,除了保留插入顺序外,还有一个现有功能使用LinkedHashSet存储一组唯一元素 如果LinkedHashSet中已经存在某个特定元素,则需要检索该元素。i、 e.当尝试添加元素时,该方法应检查该元素是否已存在,并返回现有元素。LinkedHashSet中最多可能有10000个元素 目前实现这一点的方法是在LinkedHashSet上使用迭代器 Class CustomObject { String id; String name; CustomObject (Str

除了保留插入顺序外,还有一个现有功能使用LinkedHashSet存储一组唯一元素

如果LinkedHashSet中已经存在某个特定元素,则需要检索该元素。i、 e.当尝试添加元素时,该方法应检查该元素是否已存在,并返回现有元素。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;
    }

}
类自定义对象{
字符串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)。

    A
    LinkedHashMap
    Map
    的等价物
    LinkedHashSet
    。If将为您提供插入顺序遍历,保证键的唯一性,并为您提供
    映射中项目的恒定时间查找。这可能是您的另一种选择。

    A
    LinkedHashMap
    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()
    !它应该返回实际的元素,而不仅仅是检查