4

我需要验证给定的 ID 列表不包含任何重复值。我的尝试可以在这里显示:

public void validate(RecordCollection collection)
        throws BusinessException {

    LinkedHashMap<Long, Long> existingIds = new LinkedHashMap<Long, Long>();

    for (Record record : collection.getArrayList()) {

        // check that you don't have two records with the same id
        if (existingIds.containsKey(record.getID())) {
            throw new BusinessException("records must be unique.",
                    ExceptionCodes.RECORDS_MUST_BE_UNIQUE);
        }

        //add the id to the map of existing ids
        existingIds.put(record.getID(), vo.getID());

    }

是否有更有效的方法来实施此验证?

4

3 回答 3

4

是的,有,只是稍作修改:

for (Record record : collection.getArrayList())
    if (existingIds.put(record.getID(), vo.getID()) != null)
        throw new BusinessException("records must be unique.",
            ExceptionCodes.RECORDS_MUST_BE_UNIQUE);

AMap.put()操作返回键的先前值。如果没有进入,null将被退回。在这里,由于您没有null值,这意味着如果返回码不是 NOT null,则您有一个重复项。

(另外,为什么 a LinkedHashMap?你的方法返回void,所以插入顺序无关紧要;只需使用 a HashMap

(另外,如建议的那样,在构建地图时,将其大小初始化为您正在检查的集合的大小)

于 2013-06-06T10:31:40.500 回答
2

在这种情况下,我会考虑一组 id。add-method 返回一个布尔值,如果该值已经存在或不存在。

因此,您可以在任何地方使用该集合,如果添加返回“false”,则抛出异常。

关于实现: RecordCollection 应该是一个 Set 并自行检查 id。因此验证方法是 RecordCollection 的私有部分,当添加元素时,如果需要,将抛出异常。完全避免了验证循环。

如果您无法将验证添加到集合中,则有一个子类“IdenticalIDRecordCollection”

于 2013-06-06T10:37:21.430 回答
1
 Set set=new HashSet<>(collection.getArrayList());
 System.out.println(x.size()==set.size());

如果没有重复则打印 true

于 2013-06-06T10:35:11.590 回答