在数组中查找不同的重复项

时间:2013-04-15 02:42:02

标签: java arrays methods

我正在尝试编写一个方法来查找数组中的重复值,并在发生两次时返回true(否则返回false)。

我有一些东西,但由于某种原因,它在某种情况下无法正常工作:

public static boolean twoDuplicates(int[] values) {

    boolean twoDuplicate = false;
    int counter = 0;

    for(int i = 0; i < values.length; i++){
        for(int z = i + 1; z <= values.length - 1; z++){
            if(i != z && values[i] == values[z])
                counter++;
        }
    }
    if(counter == 2)
        twoDuplicate = true;
    return twoDuplicate;
}

现在,我测试了它,当值为[3,3,3,6,6]时它不起作用。有原因吗?

编辑:我忘了提到副本必须与众不同。

6 个答案:

答案 0 :(得分:1)

看起来你只是计算比赛的总数。即你将匹配3次(计数器= 3现在)和z一次匹配总共4次。 当我用数组运行这段代码时,我得到counter = 4;

我认为以下代码将返回不同重复项的数量(带有重复的数字,无论它出现多少次)。这将为测试阵列返回2。它首先对数组进行排序,然后查找重复项,忽略已经计数的重复项。

public static boolean twoDuplicates(int[] values) {

        boolean twoDuplicate = false;
        int counter = 0;
        Arrays.sort(values);
        int old = values[0];
        boolean numberSeen = false;
        for(int i = 0; i < values.length; i++){
            if(values[i] == old){
                if(!numberSeen){
                    counter++;
                    numberSeen = true;
                }
            }else{
                numberSeen = false;
                old = values[i];
            }
        }
        if(counter == 2)
            twoDuplicate = true;
        return twoDuplicate;
    }

答案 1 :(得分:1)

在现有代码中,您计算​​的是对数,而不是查找重复数。 您应该为每个'i'单独检查计数器。

public static boolean twoDuplicates(int[] values) {

boolean twoDuplicate = false;

for(int i = 0; i < values.length; i++){
int counter = 0;
for(int z = i + 1; z <= values.length - 1; z++){
        if(i != z && values[i] == values[z])
            counter++;
    }
   if(counter == 2) // or if(counter > 1) if finding three duplicates is also fine
      return true;
}

return false;
}

public static boolean twoDuplicates(int[] values) 
{
    for(int i = 0; i < values.length; i++)
    {
       int counter = 0;
       for(int z = i + 1; z <= values.length - 1; z++)
       {
            if(values[i] == values[z])
            {
                counter++;
                if(counter == 2) // check here if you want 2 or more duplicates
                   return true;
            }
        }
        // check here if you want exactly two duplicates
    }

    return false;
}

答案 2 :(得分:0)

根据你的逻辑,如果你有两个以上的重复,该函数将返回false,也许你应该使用“counter&gt; 1”进行判断,并且计数器定义应该放在外部迭代中。我认为算法不够聪明。

答案 3 :(得分:0)

情况就是这样:

第一个循环首先读取3.第二个循环读取第二个和第三个3s。柜台变为2。 第一个循环读取第二个3.第二个循环读取第三个3.计数器变为3 第一个循环读取第三个3.第二个循环找不到任何东西。柜台是3。 第一个循环首先读取6.第二个循环读取第二个6.计数器为4。 第一个循环读取第二个6.第二个循环找不到任何东西。柜台是4。

您需要做的是在第二次循环后放置if( counter == 2 )。这将解决您的问题。

if( counter == 2 ) return true;

答案 4 :(得分:0)

1。您需要记住找到的第一个重复对的值。

否则,连续3,3,3行 - 你会发现3次两次。 所以存储第一个重复值并比较不是它。

int firstDuplicate;


if(i != z && values[i] == values[z]) {

     if (counter == 0) {

          counter++;
          firstDuplicate = values[i];

     } else if (counter == 1 && values[i] != firstDuplicate) {

          counter++;
     }
}

2。 z <= values.length - 1应为z < values.length。正如您在第一个for中使用的那样。

3。即使块是单行的,也始终使用{ }

<强> UPD

4。找到所需内容后,使用break;停止迭代。

for(){
    for(){

    }
    if(counter == 2) {
        twoDuplicate = true;
        break;
    }
}

或更好

for(int i = 0; i < values.length && counter < 2; i++;){
    for(){

    }
}

return counter >= 2;

答案 5 :(得分:0)

这就是我只用一个循环

的方法
    public static boolean twoDuplicates(int[] values) {
    HashSet<Integer> map = new HashSet<Integer>();
    int cont = 0;
    for (int i = 0; i < values.length; i++) {
        if (map.contains(values[i])){
            cont++;
            if (cont == 2) 
                return true;
        }           
        else
            map.add(values[i]);

    }
    return false;
}