制作一个唯一的 Java 对象列表

2024-02-11

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

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 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();
    }




}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

制作一个唯一的 Java 对象列表 的相关文章

随机推荐

  • 如何在使用 Python 运行 wkhtmltopdf.exe 时停止弹出窗口

    我正在使用 wkhtmltopdf exe 使用 python 将 html 转换为 pdf wkhtmltopdf exe 的弹出窗口使我在运行它时很难处理任何其他事情 我必须转换大约 200K 个文件 并且必须同时处理其他事情 但它确实
  • 是否可以将摘要式身份验证与 XMLHTTPRequest 一起使用?

    我有一个简单的问题 是否可以将摘要式身份验证与 XMLHTTPRequest 一起使用 如果答案是否定的 那么技术原因是什么 或者如果可能的话 我该怎么做 非常感谢 谷歌到目前为止还没有好的答案 EDIT 感谢您的回答 在收到随机数后修改标
  • 设置 WPF ScrollViewer 中何时滚动

    我有一个滚动查看器 其中包含一个网格 其中有一堆表单控件 文本框 复选框 组合框等 当我通过选项卡浏览控件时 滚动查看器将滚动 但仅在必要时滚动 我的意思是我通过选项卡浏览滚动查看器中的所有内容 并且仅当控件不可见时滚动查看器才会滚动 我想
  • 为什么这些线程不按顺序运行?

    当我运行这段代码时 include
  • 在 Laravel 中同步一对多关系

    如果我有一个多对多的关系 那么用它的关系更新关系是非常容易的sync method 但是我用什么来同步一对多关系呢 table posts id name table links id name post id 在这里 每一个Post可以有
  • Google OAuth:如何使用刷新令牌?

    我可以将 Android 设备上的一次性使用令牌换成访问令牌 and a 刷新令牌 我正在尝试弄清楚如何使用刷新令牌 I found this https developers google com accounts docs OAuth2
  • 在 R 中导入和分析非矩形 .csv 文件

    我将从 Mathematica 迁移到 R 在导入过程中我不需要预测数据结构 特别是我不需要在导入之前预测数据的矩形性 我有很多文件 csv文件格式如下 tasty chicken cinnamon not tasty butter pep
  • 如何在 android 中显示简单的通知? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何在 Android 的通知栏中显
  • 寻找一种优雅且非侵入性的方式来访问类的私有方法

    免责声明 这绝不意味着在生产代码中使用 这是对 C 边缘的探索 我的问题是一个后续问题 基于与 Johannes Schaub 的讨论 在c 中调用私有方法 https stackoverflow com questions 6873138
  • 强制 enum 为 unsigned long 类型

    是否可以强制枚举的基础类型为 unsigned long 类型 谢谢 在 C 11 及更高版本中 您可以明确提及您想要的类型 enum MyEnumeration unsigned long values go here 这将允许您显式控制
  • 如何从 AWS Codebuild 构建规范文件中排除文件夹?

    所以我需要从我的工件中排除一个文件夹 但谷歌搜索找不到任何信息 version 0 2 phases install runtime versions nodejs 10 build commands echo Build started
  • 计算计算着色器内帧缓冲区的颜色直方图

    正如标题所示 我正在将场景渲染到帧缓冲区上 并尝试从计算着色器内的帧缓冲区中提取颜色直方图 我对使用计算着色器完全陌生 并且缺乏教程 示例 关键字让我不知所措 特别是 我正在努力正确设置计算着色器的输入和输出图像 这是我所拥有的 compu
  • 如何加快Python中的字符串连接速度?

    在下面的代码中 串联是瓶颈 正如你所看到的 我尝试了一些复杂的方法来加快速度 但无论如何它都很慢 我想知道是否有什么我可以做的来使它更快 顺便说一句 普通和秘密都是从二进制文件读取的数据 它们都很大 大约 1mb x b if len pl
  • 在 Cocoa 程序中访问 Swift REPL

    我可以将 LLDB 附加到用 Swift 编写的程序并访问 REPL 无论是从 Xcode 内还是通过运行 lldb n ProcessName lldb repl 1 gt 但是 如果我将 LLDB 附加到没有 Swift 运行时的进程
  • Activity 生命周期 - 每次重新定向时都会调用 onCreate

    我有一个简单的活动 可以加载位图onCreate 我发现如果我旋转设备 我可以从日志中看到onCreate又打电话来了 事实上 因为所有实例变量都再次设置为默认值 所以我知道整个 Activity 已被重新实例化 旋转 2 次后 我得到 F
  • Django 国家/地区按翻译名称排序

    我开始使用 django countries 并向我的模型之一添加一个字段 country CountryField blank True 问题是用户的语言是西班牙语 当表格显示国家列表时 它们被正确翻译 但他们是按我猜的代码或英文名称排序
  • 如何使用 Django 进行 RDS IAM 身份验证?

    我希望我的 django 应用程序使用 IAM 身份验证连接到 RDS postgres 这意味着数据库密码每 15 分钟就会过期 应该重新生成 问题是如何在运行时更改数据库密码 或者我应该更新我的数据库 URL 环境 我们为此功能实现了一
  • 为什么Sortable概念需要完全有序的值类型,而std::sort只需要“小于”可比较?

    In the 关于概念 N3701 的最新论文 http www open std org jtc1 sc22 wg21 docs papers 2013 n3701 pdf 有以下示例sort算法 template
  • C - scanf() 与 gets() 与 fgets()

    我一直在做一个相当简单的程序 将字符串 假设输入数字 转换为整数 完成后 我注意到一些非常奇特的 错误 我无法回答 主要是因为我对如何进行的了解有限 scanf gets and fgets 功能发挥作用 不过我确实读了很多文献 因此 无需
  • 制作一个唯一的 Java 对象列表

    我有一个 ArrayList 其中填充了具有名称和时间属性的对象 我想根据名称删除重复项并仅保留最新时间的记录 所以我已经覆盖了equals and hashcode我的对象中的名称并使用了这样的代码 private List