ArrayList 中的项目重复
Posted
技术标签:
【中文标题】ArrayList 中的项目重复【英文标题】:Duplication of an item in an ArrayList 【发布时间】:2017-07-01 13:59:48 【问题描述】:我将标识地址存储在我的 ArrayList 中。问题是我重复存储它。
以下是相关代码:
public void storeIDs(final String emailAddress)
SharedPreferences.Editor editor = context.getSharedPreferences("storeIds", MODE_PRIVATE).edit();
IDAddresses.add(emailAddress);
for(int i=0;i<IDAddresses.size();i++)
editor.putString("value"+i,IDAddresses.get(i));
editor.putInt("emailListSize",IDAddresses.size());
editor.apply();
如何检查 emailAddress
是否已经存在于 ArrayList IDAddresses
中,如果存在,则不要存储它?
【问题讨论】:
为什么不使用Set
?
【参考方案1】:
//use this :
if( !IDAddresses.contains(emailAddress) )
IDAddresses.add(emailAddress);
//instead of just this :
IDAddresses.add(emailAddress);
【讨论】:
【参考方案2】:SharedPreferences sh = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
if(sh.Contains(IDAddresses.get(i))//do nothing
else editor.putString("value"+i,IDAddresses.get(i));
【讨论】:
【参考方案3】:根据您的描述,Set
是您应该选择的数据结构。
Hashtable
的Set
HashSet
) contains() O(1)
会比 ArrayList.contains() O(n)
快
【讨论】:
【参考方案4】:正如@Kent 建议的那样,您应该为此使用Set
。
不包含重复元素的集合。更正式地说,集合不包含满足 e1.equals(e2) 的元素 e1 和 e2 对,并且最多包含一个空元素。
Set<String> IDAddresses = new HashSet<>();
然后:
IDAddresses.add(emailAddress);
另一种方法,不推荐,但如果你打算使用ArrayList
反正:
List<String> noDupes = Lists.newArrayList(Sets.newHashSet(IDAddresses));
基本上通过将ArrayList
转换为HashSet
来删除重复项。 使用番石榴。
如果您使用的是 Java 8,您也可以使用 lamdas:
List<String> noDupes= IDAddresses.stream().distinct().collect(Collectors.toList());
【讨论】:
【参考方案5】:只需使用 ArrayList.contains(desiredElement)。例如,如果您要查找示例中的 conta1 帐户,则可以使用以下内容:
if (IDAddresses.contains(i))
System.out.println("Account found");
else
System.out.println("Account not found");
这个方法我没试过。你必须用这个方法ArrayList.contains(desiredElement)来检查arraylist中的值是否存在。
请通过此链接Check if a value exists in ArrayList
【讨论】:
在 for 循环中使用这个 if 条件。以上是关于ArrayList 中的项目重复的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 ArrayList<String> 中的最后一项 [重复]
Java基础练习题10--[使用ArrayList获取10个随机数;String类型的ArrayList集合,去除ArrayList中的重复元素,模拟注册,登录存入集合]