通过任何属性创建对象的唯一列表

时间:2019-03-18 07:06:11

标签: java generics arraylist set

我正在尝试创建将具有List行为但将Field的{​​{1}}作为行为应确定唯一性的属性的名称的泛型类。 例如,我们有String类:

User

我想让班级说一个名字public class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 。 为了能够提供给构造函数UniqueList,这将使该用户列表在用户的属性名称中是唯一的,并且该列表将不能包含两个名称为“ John”的User对象例子。

就目前而言,我试图创建扩展User.class.getDeclaredField("name")并实现ArrayList<T>的类,但是我在逻辑上开始陷入混乱。 也许有些人已经有了类似的东西,可以分享或帮助理解如何实现它。 目前我拥有的代码:

Set<T>

1 个答案:

答案 0 :(得分:0)

您的逻辑似乎是正确的。替换时,别忘了从列表中删除对象:

    @Override
    public boolean add(T t) {
        try {
            //get value of the key from provided object.
            Object keyValue = keyField.get(t);
            if (hashMap.containsKey(keyValue)) {
                super.remove(hashMap.get(keyValue)); // << remove old object from list
                hashMap.remove(keyValue);
            }
            hashMap.put(keyValue, t);
            super.add(t);
            return true;
        } catch (IllegalAccessException | NullPointerException e) {
            e.printStackTrace();
        }
        return false;
    }

相应地覆盖其他添加/删除方法。请记住,ArrayList扩展了List,因此您还需要覆盖ArrayList的add / remove方法(例如add(int index, E element)remove(int index)等)