【发布时间】:2018-09-04 13:56:54
【问题描述】:
我知道有很多关于“删除列表的重复项”的主题。我喜欢HashSet 的解决方案。但是,我所拥有的是一个 String[] 列表,它无法使用它。可能是因为stringArray1.equals(stringArray2) 会返回false,即使两个stringArray 相同;要比较字符串数组,我们必须使用 Arrays.equals,而 HashSet 不是这种情况。
所以我有一个String[] 用户的用户列表,其中只有 2 个字符串:用户名和用户 ID。由于两者都是链接的(每个用户名只有一个用户 ID),我只比较其中一个字符串就足够了。
我需要的是一种从列表中删除重复项的快速方法。
我想过这样的事情:
List<String> userNamesList = new ArrayList<String>();
List<String[]> userListWithoutDuplicates = new ArrayList<String[]>();
for(String[] user : userList){
if(!userNamesList.contains(user[0])){
userNamesList.add(user[0]);
userListWithoutDuplicates.add(user);
}
}
但是,这需要两个新的 List 和一个循环(我很确定任何其他解决方案仍然需要这个循环)。
我想知道是否没有更好的解决方案。我认为应该已经在某个地方实施了类似的事情。
编辑:我从一个 sql 查询中得到了我的数组。事实上,我有一个数据库和一些用户。一个用户将在 DB 中搜索响应某些条件的其他用户,DB 将 String[] {username, userID} 列表发送回该用户。 所以我已经有一个用户类,其中包含的不仅仅是用户名和 ID。每个连接的用户都有一个此类的实例,但数据库无法访问这些实例,因此她无法发送它。 我认为字符串数组是一个简单的解决方案。我没想到,在某些情况下,一个用户可以在 DB 中被多次引用,因此被选中多次。这就是为什么我的列表中有重复项。
【问题讨论】:
-
你为什么使用
String[]而不是User类? -
您使用的是哪个版本的 Java?
-
您应该将数组转换为具有 2 个字段的对象,并让它们覆盖
equals()和hashcode() -
我正在使用 java 10。我从 sql 查询中得到了我的数组。我将编辑帖子以更好地解释。
-
@Abila 是的,我理解,但是当您检索数据时,您仍然可以将它们转换为对象。您如何访问您的数据库?