【问题标题】:Duplication of an item in an ArrayListArrayList 中的项目重复
【发布时间】: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

标签: java android


【解决方案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 是您应该选择的数据结构。

      • Set 将存储重复的 (equals() ) 元素,因此您不必检查和添加
      • 如果你需要检查一个元素是否存在于你的集合中,一个基于HashtableSet​​​​ 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 条件。
          猜你喜欢
          • 2018-05-29
          • 1970-01-01
          • 2021-05-29
          • 2012-01-26
          • 2014-04-08
          • 2021-03-29
          • 2022-01-02
          • 1970-01-01
          • 2013-03-29
          相关资源
          最近更新 更多