我正在努力创建一种方法,用于计算我是否得到三种滚动总共5个骰子。我已经创建了一些你可以在下面看到的东西,但它似乎没有正确的工作方式。整个目标是看你是否已经滚动了3个相同的数字然后如果有,将该数字乘以10并将其加到你的分数上。例如,如果您滚动5,5,5,1,2,则会为总分增加50。
我的想法是创建一个ArrayList并解析每个dierolled数并将其添加到新的ArrayList,同时检查重复项和使用计数器。
这是我提出的,但正如我所说,它并没有真正成功。如果有人看到我如何改善这一点或正确地做到这一点,请不要犹豫,加入!
注意:假设dierolled是存储5个骰子的地方,而updateTotalScore是一种在分数类中更新分数的方法。
public void rule2b(ArrayList<Integer> dierolled){
ArrayList<Integer> numbers = new ArrayList<Integer>();
int counter = 0;
for (int i = 0; i < dierolled.size(); i++){
int b = dierolled.get(i);
if (numbers.contains(b)){
counter++;
}
numbers.add(b);
if (counter == 3){
score.updateTotalScore(b*10);
}
}
}
答案 0 :(得分:1)
我会对列表进行流式处理,计算每个元素的出现次数,并检查它们是否出现过三次以上:
{{1}}
答案 1 :(得分:0)
我更喜欢Mureinik @的回答。但如果你还没有意识到java8的功能,这里有一个没有stream和lambdas的简单解决方案
Map<Integer, Integer> count = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
int element = list.get(i);
if (count.get(element) == null) {
count.put(element, 1);
} else {
count.put(element, count.get(element) + 1);
}
}
for (Map.Entry<Integer, Integer> entry : count.entrySet()) {
if (entry.getValue() >= 3) {
System.out.println(entry.getKey());
//If there will be only one element with occurrence more than 3, you can break here.
}
}
编辑:OP的另一个版本只想使用一个ArrayList。
Collections.sort(list); //Sort the list - O(nlogn)
int element = list.get(0); //Beware of IndexOutOfBoundsException - I assume empty list at the start of the method
int counter = 1; //To count number of times element has occurred
for(int i = 1; i < list.size(); i++) {
int currentElement = list.get(i);
if (element == currentElement) {
counter++; //Previous and current element are same
} else {
counter = 1; //We have seen a new number
}
if (counter == 3) {
System.out.println(element); //Printing the element that has occurred 3 times
//score.updateTotalScore(element * 10);
}
element = currentElement;
}
答案 2 :(得分:0)
另一种解决方案:
int[] dice = new int[6];
for (int i=0; i<list.size(); i++) {
int num = list.get(i);
dice[num-1]++;
if(dice[num-1] == 3) {
score.updateTotal(num*10);
}
}