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

时间:2013-05-01 11:46:38

标签: java

现有的功能除了保留插入顺序外,还使用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;
    }

}

是否有一种有效的替代数据结构方式

  1. 存储唯一值

  2. 如果尝试添加

  3. 时已经存在,则返回特定元素
  4. 保留广告订单(如果可能)

  5.   

    由于添加的customObject已经在集合中,因此返回   customObject本身是有道理的。但是,因为某种方式不起作用   迭代器,因为我在节点内构建节点。返回的customObject可能有子节点   节点

4 个答案:

答案 0 :(得分:2)

使用LinkedHashMap<CustomObject, CustomObject>代替LinkedHashSet<CustomObject>

(这假设CustomObject.equalsCustomObject.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)

LinkedHashMapMap相当于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,因此保留了广告订单。