java - 过滤列表的优雅解决方案,使其对于给定的对象属性是唯一的

标签 java guava

我有一个对象的扁平化多映射(列表),我想将其转换为一个列表,其中“关键”属性/字段(例如下面的 name)在所有条目中是唯一的.

在多个条目具有相同键(名称)的情况下,应选择具有最大creationDate 字段的条目。

示例:

List<Object> myList =
[
  {name="abc", age=23, creationDate = 1234L},
  {name="abc", age=12, creationDate = 2345L},
  {name="ddd", age=99, creationDate = 9999L}
]

应转换为:

List<Object> = 
[
  {name="abc", age=12, creationDate = 2345L},
  {name="ddd", age=99, creationDate = 9999L}
]

有没有一种优雅的方法(可能使用 Guava 库?)在 Java 中解决这个问题?我意识到我可以尝试使用以 name 作为键的 HashMap 来查找所有唯一的条目,但我觉得有更好的方法来解决这个问题。

谢谢!

最佳答案

如果您有可能使用 Java 8,我会推荐 Streams 作为其他答案。 如果没有,你可以选择这样的东西。

首先,您按创建日期对列表进行降序排序。然后你创建一个 TreeSet 女巫平等对待所有同名的人。因此,只会添加第一个(最高的)creationDate,而忽略其他的。

List<Person> persons = new ArrayList<>();
persons.add(new Person("abc", 23, 1234L));
persons.add(new Person("abc", 12, 2345L));
persons.add(new Person("def", 99, 9999L));

Collections.sort(persons, new Comparator<Person>() {
    public int compare(Person o1, Person o2) {
            return (int) (o2.creationDate - o1.creationDate);
    }
});

Set<Person> personsHashed = new TreeSet<>(new Comparator<Person>() {
    public int compare(Person o1, Person o2) {
        return o2.name.compareTo(o1.name);
    }
});
personsHashed.addAll(persons);

关于java - 过滤列表的优雅解决方案,使其对于给定的对象属性是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24273891/

相关文章:

java - 如何不给Guava的LoadingCache添加空值?

java - 使用多个分隔符分割查询字符串 - java

list - 代码质量/ Guava : clear and fill a final list or assign a new Immutablelist

java - 比较映射忽略给定字段

java - firebase 访问 token 是否自动刷新?

java - 如何从JDBC+postgreSql时间戳获取UTC时间戳?

java - 在 netbeans 中运行时裁剪图像

java - onclick 在滚动后起作用

java - 取消部署时,将 EJB 注入(inject) SessionScoped ManagedBean 会生成异常

java - 如何使用 Scala 中的 Guava 类 (HashMultiset)?