【问题标题】:find duplicates strings in arraylist在arraylist中查找重复的字符串
【发布时间】:2015-02-27 13:16:04
【问题描述】:

我需要我的程序通过所有客户电话号码的数组列表并打印出具有相同号码的人。我将数字注册为字符串并尝试了此解决方案,但出现错误...有人可以帮助我吗? 谢谢

boolean duplicates=false;
        for (int j=0;j<TelefonNrLista.size();j++)
          for (int k=j+1;k<TelefonNrLista.size();k++)
            if (k!=j && TelefonNrLista(k).getTelNr().equals(TelefonNrLista(j).getTelNr());
              duplicates=true;
    }

【问题讨论】:

  • StackTrace 请..
  • if 语句中没有右括号。由于内部循环构造,k != j 始终为 false
  • @Phylogenesis 你的意思是因为内部循环,它总是正确的吗?
  • @nafas 是的。愚蠢的错误。
  • 好的,这是我现在的代码...如果我只有 2 个人使用相同的 tel nr,它可以工作,但如果我有超过 2 个,则不能...我如何正确处理? public static void listaTelNr() { for(int y=0;y

标签: java arraylist


【解决方案1】:

你的代码应该是这样的:

boolean duplicates=false;
for (int j=0;j<TelefonNrLista.size();j++) {
    for (int k=j+1;k<TelefonNrLista.size();k++) {
        if (k!=j && TelefonNrLista(k).getTelNr().equals(TelefonNrLista(j).getTelNr()) {
            duplicates=true;
        }
  }
}

你的做法在 Java 中并不是一个好的做法。

【讨论】:

  • 你可以像上面那样将第一个循环减少1次迭代,但这实际上并没有改变代码。
【解决方案2】:

要查找它是否有重复项,您可以使用 HashSet 构造函数作为列表并检查 size() 属性...

Set noDuplicates = new HashSet(TelefonNrLista);

if (noDuplicates.size() < TelefonNrLista.size()){
    // do your stuff
}

【讨论】:

  • 你不能用这样的集合,你不知道他自定义类equals方法的实现细节。 getTelNr() 方法表明他正在使用一些自定义类。
  • 我完全同意使用HashSet,但是要使用它,你必须先覆盖hashCode和equals方法
【解决方案3】:

您必须使用如下所示的算法:

public Set<Client>lookForDuplicater(List<Client> TelefonNrLista  )
{
    Set<Client> duplicates = new Hashset<Client>(); // hash does not allow duplicates by definition
    Iterator<Client> iterator = TelefonNrLista.iterator();
    while(iterator.hasNext()
    {
        Client current = iterator.next();
        Itarator2 = TelefonNrLista.iterator();
        while(iterator2.hasNext())
        {
            Client candidate = iterator2.next();
            // You don't want to compare the same instance
            if (current.equals(candidate) == false)
            {

              //  if (current.getTelNr()==candidate.getTelNr()) this for integer
                  if (current.getTelNr().equals(candidate.getTelNr())) // this works for strings
                {
                    duplicates.add(current);
                    break;
                }
            }

        }
    }
    return duplicates ;
}

使用返回的 Set,您可以轻松检查它是否为空 (duplicates.isEmpty()),如果为空则表示它没有重复项。如果它不为空,则重复项在集合内。

【讨论】:

  • 这还不够,因为 equals 和 hashCode 方法还没有被覆盖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2014-05-09
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多