java - 创建一个唯一的对象列表 Java

标签 java list collections unique

我有一个 ArrayList 填充了具有属性名称和时间的对象。我想根据名称删除重复项,只保留最新时间的记录。所以我覆盖了 equalshashcode用于我对象中的名称并使用这样的代码。

private List<ChangedRecentlyTO> groupRecords(List<ChangedRecentlyTO> toList) {
    changedRecentlyList.clear(); //static list
    for(ChangedRecentlyTO to : toList) {
        if(!changedRecentlyList.contains(to)) {
            changedRecentlyList.add(to);
        } else {
            if(changedRecentlyList.get(changedRecentlyList.lastIndexOf(to)).getTimeChanged().before(to.getTimeChanged())) {
                changedRecentlyList.remove(to);
                changedRecentlyList.add(to);
            }
        }
    }
    return changedRecentlyList;
}

但我想知道,有没有更好的解决方案?我正在考虑使用 Set 但我无法弄清楚我应该如何将时间标准放在那里。

最佳答案

你有两种方式,一种需要了解集合是如何工作的,另一种对于不太了解 Java 集合的人来说更容易理解:

如果你想让它简单,你可以简单地阅读 Set 的 Javadoc,http://docs.oracle.com/javase/6/docs/api/java/util/Set.html#add(E 的详细信息。 )。它明确指出,如果一个元素已经在里面,则不会再添加它。

  • 您仅使用名称
  • 来实现您的 equals 和 hashcode。
  • 您按时间对项目进行排序,然后将它们添加到集合中。

  • 这样,第一次将项目添加到 Set 时,您将添加具有最新时间的元素。当您添加其他人时,它们将被忽略,因为它们已经包含在内。

    如果其他人不完全了解 java.util.Set 的契约行为,您可能需要扩展 Set 以使您的意图更清晰。但是,由于不应访问 Set 以“在删除后取回元素”,因此您需要使用 HashMap 来支持您的集合:
    interface TimeChangeable {
       long getTimeChanged();
    }
    public class TimeChangeableSet<E extends TimeCheangeable> implements Set<E> {
    
        private final HashMap<Integer,E> hashMap = new HashMap<Integer,E>();
    
        @Override
        public boolean add(E e) {
            E existingValue = hashMap.remove(e.hashCode());
            if(existingValue==null){
                hashMap.put(e.hashCode(),e);
                return true;
            }
            else{
                E toAdd = e.getTimeChanged() > existingValue.getTimeChanged() ? e : existingValue;
                boolean newAdded = e.getTimeChanged() > existingValue.getTimeChanged() ? true : false;
                hashMap.put(e.hashCode(),e);
                return newAdded;
            }
    
        }
    
        @Override
        public int size() {
            return hashMap.size();
        }
    
        @Override
        public boolean isEmpty() {
            return hashMap.isEmpty();
        }
    
        @Override
        public boolean contains(Object o) {
            return hashMap.containsKey(o.hashCode());
        }
    
        @Override
        public Iterator<E> iterator() {
            return hashMap.values().iterator();
        }
    
        @Override
        public Object[] toArray() {
            return hashMap.values().toArray();
        }
    
        @Override
        public <T> T[] toArray(T[] a) {
            return hashMap.values().toArray(a);
        }
    
        @Override
        public boolean remove(Object o) {
            return removeAndGet(o)!=null ? true : false;
        }
    
        public E removeAndGet (Object o) {
            return hashMap.remove(o.hashCode());
        }
    
        @Override
        public boolean containsAll(Collection<?> c) {
            boolean containsAll = true;
            for(Object object:c){
                E objectInMap = removeAndGet(object);
                if(objectInMap==null || !objectInMap.equals(object))
                    containsAll=false;
            }
            return containsAll;
        }
    
        @Override
        public boolean addAll(Collection<? extends E> c) {
            boolean  addAll=true;
            for(E e:c){
                if(!add(e)) addAll=false;
            }
            return addAll;
    
        }
    
        @Override
        public boolean retainAll(Collection<?> c) {
            boolean setChanged=false;
            for(E e: hashMap.values()){
                if(!c.contains(e)){
                    hashMap.remove(e.hashCode());
                    setChanged=true;
                }
            }
            return setChanged;
        }
    
        @Override
        public boolean removeAll(Collection<?> c) {
            throw new UnsupportedOperationException("Please do not use type-unsafe methods in 2012");
        }
    
        @Override
        public void clear() {
            hashMap.clear();
        }
    
    
    
    
    }
    

    关于java - 创建一个唯一的对象列表 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11448129/

    相关文章:

    java - Spring data JPA 检索两个日期之间的数据不起作用

    list - (wx)最大: does `makelist` work in parallel or serially?

    list - Scala 中 Seq 和 List 的区别

    c# - ReadOnlyCollection 类是不良设计的好例子吗?

    java - Java 集合上的原子复制和清除

    java - 为什么类型的空变量声明显示编译错误而不是空声明?

    java - Openjpa锁不起作用

    java - 部署 tomcat 时出现运行失败错误

    python - 修改一个元素会修改Python中的整列

    具有可能重复值的两个列表之间的 Python 差异