0

除了保留插入顺序外,还有一个现有功能使用 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. 保留广告订单(如果可能)

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

4

4 回答 4

2

使用 aLinkedHashMap<CustomObject, CustomObject>而不是LinkedHashSet<CustomObject>.

(这假设CustomObject.equalsCustomObject.hashcode使用您当前的“匹配”方法。否则使用带有外部“哈希器”的第 3 方替代方案......)

方法变为:

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)

于 2013-05-01T12:16:31.920 回答
1

A等价LinkedHashMap于。如果会给你插入顺序遍历,保证键的唯一性,还可以让你在. 这可能是您的替代方案。MapLinkedHashSetMap

于 2013-05-01T12:09:00.630 回答
0

只要打电话contains()。它被指定为 O(1)。

于 2013-05-01T11:49:31.543 回答
0

从我理解的问题来看。满足您的要求的LinkedHashSet作品就好了。

但我假设你已经正确地实现equals() and hashcode()了。CustomerObject

所以:

存储唯一值

Set 为您提供了该功能。

如果尝试添加时已经存在,则返回特定元素

使用您的 equals 和 hashcode 方法,只需执行

if (set.contains(obj)) "return" obj;

上面的“return”不是您方法中的return语句,表示如果包含true,只需将您要插入的对象即可。因为它等于集合中的 obj。(不必迭代 Set 并获得相等的对象)

并且contains(obj)需要O(1),由于哈希表。

保留广告订单(如果可能)

linkedhashSet基于linkedList,因此保留了插入顺序。

于 2013-05-01T12:29:29.590 回答