0

我有一个关于数组的非常通用的问题。这是我必须为家庭作业做的掷骰子游戏。

我有一个长度为 7 的数组,其中包含整数,这些整数是我的各种掷骰子方法的结果,我需要找出该数组是否包含一个元素的多个实例、该元素是什么以及它出现了多少次。作为 Java 新手,我什至不知道在哪里寻找可以执行此类操作的方法。有谁知道我在哪里可以找到一个,或者更好的是关于如何自己写一个的提示?

从概念上讲,对我来说最困难的部分之一是我不知道我会有多少结果,因为最多可能有两对和三对。IE int[] roll = { 3, 3, 4, 4, 5, 5, 5 }。我认为解决它的最佳方法是使用循环,直到我的多重查找方法失败,每次都删除匹配的元素。

非常感谢您的帮助,这是午夜时分!

4

4 回答 4

1

通常的方法是使用 aMap来累积频率:

int[] roll = { 3, 3, 4, 4, 5, 5, 5 };

Map<Integer, Integer> counts = new HashMap<>(roll.length);

for (int a : roll)
    counts.put(a, counts.containsKey(a) ? counts.get(a) + 1 : 1);

for (Entry<?, Integer> e : counts.entrySet())
    if (e.getValue() > 1)
        System.out.println(e.getKey() + "\t" + e.getValue());
3 2
4 2
5 3

第一列是掷骰子,第二列是频率。

于 2013-10-30T00:52:22.120 回答
0
int[] arr = { 2, 2, 4, 4, 4, 6, 6, 6, 6 };  // Can have any length.
Map<Integer, Integer> elemCount = new HashMap<Integer, Integer>();
Integer count = 0;
for ( int element : arr )
{
    count = elemCount.get ( (Integer) element );
    if ( count == null )
    {
        count = 1;
    }
    else 
    {
        count++;
    }
    elemCount.put ( (Integer) element , (Integer) count );
}
System.out.println ( elemCount.toString() );
于 2013-10-30T01:38:22.007 回答
0
int[7] rollCounts = {0};
for(int i=0; i<roll.length; ++i)
    rollCounts[roll[i]]++;

使用此方法,rollCounts[1]将包含1in的出现次数roll[]rollCounts[2]并将包含2inroll[]等的出现次数。(rollCounts[0]应该始终0假设roll[i]从不包含 a 0,它不应该)。

然后,您可以使用一些逻辑来检查rollCounts[i]不同的for循环,以根据出现的次数执行您需要执行的任何操作。

老实说,您可以将掷骰子存储在这个数组中,除非跟踪掷骰子的顺序很重要。

于 2013-10-30T00:51:17.990 回答
0

您不应该为此使用数组。最好使用的是Map<Integer, Integer>. 键是数字,值是出现的次数。这是跟踪数字的示例代码,如下所示:

Map<Integer, Integer> numbers = new Map<Integer, Integer>();
public void addNumber(int n) {
    if (numbers.get(n) == null)
        numbers.set(n, 0);
    int count = numbers.get(n);
    numbers.set(n, count + 1);
}

public int countForNumber(int n) {
    if (numbers.get(n) == null)
        return 0;
    return numbers.get(n);
}
于 2013-10-30T00:52:00.453 回答