在数组中查找重复项

时间:2011-04-09 02:45:57

标签: java arrays compare duplicates

我正在编写一个方法,它将获取值和数组并查找重复项。如果有重复项,例如两个值具有相同的值,我将该值乘以2.如果两个值具有相同的值,我将该值乘以3.这将继续,直到七个值相同为止。我会将该值乘以7。

这是我的源代码。

public static double calculateWinnings(int[]numbers)

    {
        double total = 0;
        for (int i = 0; i < numbers.length - 1; i++)
        {
            for (int j = i + 1; j < numbers.length; j++)
            {
                if(numbers[i] == numbers[j])
                {
                    total = numbers[i] * .01;
                    System.out.println("Total is " + total);
                    return total;
                }
            }
        }
        return total;

    }

3 个答案:

答案 0 :(得分:1)

如果订单无关紧要,您应先排序,然后再进行分析。

排序会将相同的值放在一起,您可以在for循环中更容易地注意到它们。

Java Collections类也可以在这里使用。

例如参见http://download.oracle.com/javase/tutorial/collections/intro/index.html

例如,如果您不想先排序并使用循环,则可以使用集合类中的HashMap。

HashMap<Integer, Integer> counts = new HashMap<Integer, Integer>();
for(int i=0; i < numbers.length; ++i){
  Integer before = counts.get(numbers[i]);
  if (before == null) before=0;
  counts.put(numbers[i], before+1);
}

现在你有一个从数字到数字的映射器 稍后您可以使用max(counts.valueSet())之类的内容来查找最大计数 然后循环回哈希,查看导致该数字的数字。

答案 1 :(得分:0)

如果在索引1,4,6处有相同的值,则可以使用

找到它们
i j conclusion
--------------
1 4  2 values
1 6  3 values
4 6  4 values // oops! already counted

等等。那么你会 - 但没有so on,因为你在第一次击中时返回:

    if(numbers[i] == numbers[j])
    {
        total = numbers[i] * .01;
        System.out.println("Total is " + total);
        return total; // oops!
    }

您的意思是break吗?

答案 2 :(得分:0)

您应该提供一些示例输入和输出。目前尚不清楚您期望的输出结果。您是否只是想找到最重复的数字,然后将该数字乘以它出现的频率?例如:

1 2 5 5 5 7 8 8 = three 5's = 15    
或许这两个8的胜利是因为他们的总数是16?或者你要总结所有的副本?在任何情况下,我都会从这开头,其中MAX_NUM是您在数组中所期望的最高数字:

int[] counts = new int[MAX_NUM];
for (int i = 0; i < numbers.length; i++) {
    counts[numbers[i]]++;
}

现在您拥有每个号码的计数。如果您正在寻找计数最高的数字:

int num = 0;
int best = 0;
for (int i = 0; i < counts.length; i++) {
    if (counts[i] > best) {
        num = i;
        best = counts[i];
    }
}

我的例子现在num * best为15。现在num将包含最多出现的数字,best将是它的计数。如果有两个具有相同计数的数字,则较高的数字将获胜。也许在我上面的例子中你想要16而不是15,因为两个8有更大的总和:

int max = 0;
for (int i = 0; i < counts.length; i++) {
    max = Math.max(i * counts[i], max);
}

现在max会有16个。