2017-08-03 84 views
-1

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

下面是用户等级:

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

谢谢。

+0

您使用循环 –

+2

'=='和'!='在Java中比较基准的平等,而不是数据面前人人平等有你'userList'未初始化的数据。如果你想检查id是否相等,使用'user.getId()。equals(id)'。 – azurefrog

+0

如果你修改你的'User'类来给它明智的['equals'](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang .Object)和['hashCode'](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--)方法(为了完整性而使用'toString') ,那么你可以使用“[从java中的arraylist获取唯一值](https://stackoverflow.com/questions/13429119)”中的解决方案。 –

回答

1

如果你不想重复但想要使用ArrayList,可以快速修复所有项目到HashSet(不允许重复项目),清除ArrayList,然后将项目从HashSet返回到ArrayList中。

+0

哈希码是不是int它是一个字符串? –

+0

List result = new ArrayList (); 设置 ids = new HashSet (); (用户用户:originalList){ (if)(ids.add(user.getId()){result)。添加用户); } } –

2

当你的错误is simply not comparing Strings correctly,有一个更好的方式来做到这一点:

  • 添加hashCodeequalsUser
  • 将这些物品放入一个LinkedHashSet

什么你完成:

  • 定义hashCode允许您使用需要散列值的数据结构,如Set
  • LinkedHashSet保留了插入顺序并消除了一些额外内存的副本。
+0

什么是hashCode不是int?什么是hashCode是字符串? –

+0

@DanielFoo:'hashCode' *总是*'int'。你正在计算一个值。如果你不太确定,那么你可以使用'31 * id.hashCode()+ 31 * date.hashCode()',但请注意,我是这么做的,并且不会保证它的可靠性任何。 *我*作为练习给读者。 – Makoto

+0

在我的情况下,用户标识可能有字母。如何重写散列码,如果我要按字符串ID比较用户,则该值等于。 –

-1

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

下面的东西可以满足您的需求。

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

这就要求元素是“可比较的”。 – Makoto