gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:54:57 25 4
gpt4 key购买 nike

我有一个 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com