【问题标题】:Creating an ArrayList of unique items in an ArrayList in Java [duplicate]在Java中的ArrayList中创建唯一项的ArrayList [重复]
【发布时间】:2017-08-03 22:13:52
【问题描述】:

我得到了一个用户数组列表,这些用户每天可以多次登录网站。 如何从第一个数组列表中创建唯一用户的 ArrayList。 换句话说,我需要忽略多个登录。 例如,如果有 20 个网站登录,并且所有这些登录都是由两个用户进行的,那么第二个列表应该只包含两个用户对象。 我是 Java 编程语言的新手,我需要帮助。

这是用户类:

public class User {

    private String id
    private String date;

    public String getId() {
        return id
    }

    public void setId(String id) {
        this.id = id
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

这就是我将如何解决这个问题,但由于某种原因它不起作用。

ArrayList<User> userList = new ArrayList<>();
ArrayList<User> uniqueUserlist = new ArrayList<>();

    String id = null;

    for(User user : userList) {

        if (user.getId() != id) {
            uniqueUserlist.add(user);
        }

        id = user.getId();
    }

谢谢。

【问题讨论】:

  • 在循环中使用之前,您还没有为您的userList 初始化数据
  • ==!= 在 Java 中比较引用相等,而不是数据相等。如果要检查 id 是否相等,请使用 user.getId().equals(id)
  • 如果你修改你的 User 类以赋予它合理的 equalshashCode 方法(和 toString 完整性),那么你可以使用“Get unique values from arraylist in java”中的解决方案。

标签: java arraylist


【解决方案1】:

虽然您的错误 is simply not comparing Strings correctly,但有更好的方法来做到这一点:

  • hashCodeequals 添加到您的 User 类中
  • 将这些项目放入LinkedHashSet

你完成了什么:

  • 定义hashCode 允许您使用需要哈希值的数据结构,例如Set
  • LinkedHashSet 保留插入顺序并消除重复,但会增加一点内存。

【讨论】:

  • 什么是hashCode不是int? hashCode是什么字符串?
  • @DanielFoo: hashCode 总是 int。您正在计算一个值。如果您不太确定,那么您可以使用31 * id.hashCode() + 31 * date.hashCode(),尽管请注意我这样做是出于我的想法,并且不会保证它的可靠性。 我留给读者作为练习。
  • 在我的情况下,用户 ID 可能有字母。如果要按字符串 id 比较用户,如何覆盖 hashcode 和 equals。
【解决方案2】:

如果您不想重复但想使用 ArrayList,则快速解决方法是将所有项目移动到 HashSet(不允许重复),清除 ArrayList,然后将 HashSet 中的项目重新添加到数组列表。

【讨论】:

  • 哈希码不是 int 它是一个字符串?
  • List 结果 = new ArrayList(); Set ids= new HashSet(); for( 用户 user : originalList ) { if( ids.add( user.getId() ) { result.add( user); } }
【解决方案3】:

您可以使用 Stream API....将您的列表放入 TreeSet 中,您可以从中提供一个自定义比较器来唯一地比较 id。

以下内容可以满足您的需求。

ArrayList<User> uniqueUserlist = userList.stream()
                            .collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparingInt(User::getId))), ArrayList::new));

【讨论】:

  • 这要求元素是Comparable
猜你喜欢
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2023-03-04
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多