我正在编写一个方法,它将获取值和数组并查找重复项。如果有重复项,例如两个值具有相同的值,我将该值乘以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;
}
答案 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个。