Итак, у меня есть задача: я должен бросить кости, а затем найти определенную комбинацию, если она выпала. У меня есть переопределенный метод equals, который проверяет комбинацию и работает правильно. Каждый объект из class Dice
имеет свой собственный массив строк, который содержит информацию о том, при каком броске выпадает комбинация. Например, комбинация двух выпавших игральных костей (2, 4)
была выброшена при 5-м броске из 5, поэтому ее массив имеет: [.., .., .., .., 5]
И затем каждый объект из class Dice
сохраняется в List<Dice>
, который, с другой стороны, помещается в хэш-карту вместе с массивом строк каждой кости. Моя борьба заключается в том, что я не могу понять, как перебирать список игральных костей и проверять, была ли каждая комбинация выброшена более одного раза, и помещать информацию о том, на каком броске она находится, в первую, а затем удаляя дубликат.
Например, предположим, что комбинация (4, 1)
была выброшена на первом, а затем на 4-м броске... ее строковый массив должен выглядеть так: [1, .., .., 4, ..]
, вместо этого печать хэш-карты показывает 2 элемента с комбинацией (4, 1)
и их собственными массивами:
[1, .., .., .., ..]
, [.., .., .., 4, ..]
.
Надеюсь, вы понимаете мою борьбу.
public class Dice {
private int firstDice;
private int secondDice;
public String[] rollArray;
public int roll;
public int duplicate = 1;
/**
* Constructor for the class Dice.
* @param first first dice
* @param second second dice
*/
public Dice(int first, int second) {
firstDice = first;
secondDice = second;
}
@Override
public String toString() {
return "(" + firstDice + ", " + secondDice + ")";
}
/**
* Method equals used for comparing two objects from the class Dice.
* @param obj object from dice class
* @return returns true/false if conditions are matched.
*/
public boolean equals(Dice obj) {
return (obj.firstDice == firstDice && obj.secondDice == secondDice);
}
}
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
/**
* Created by leo on 6/10/15. Class which contains all methods that realize the rolling of two dices
* and storing the information about them in a hash map.
*/
public class DiceRoller {
public List<Dice> diceList = new LinkedList<>();
public List<String> rollingList = new LinkedList<>();
/**
* A method which rolls two dices a number of times with random values.
*
* @param numberOfRolls number of rolls
*/
public void rollDice(int numberOfRolls) {
Random rand = new Random();
for (int i = 0; i < numberOfRolls; i++) {
diceList.add(i, new Dice(rand.nextInt(7 - 1) + 1, rand.nextInt(7 - 1) + 1));
diceList.get(i).rollArray = new String[numberOfRolls];
diceList.get(i).roll = i + 1;
diceList.get(i).rollArray[i] = diceList.get(i).roll + "";
rollingList.add("" + (i + 1));
checkDuplicateDice(diceList, diceList.get(i));
}
}
private void checkDuplicateDice(List<Dice> listOfDice, Dice tempDice) {
/*
* for (int i = 0; i < listOfDice.size(); i++) { for (int j = i + 1; j < listOfDice.size(); j++)
* { if (listOfDice.get(i).toString().equals(listOfDice.get(j).toString())) {
* listOfDice.get(i).duplicate++; } } } for (int i = 0; i < listOfDice.size(); i++) {
* System.out.println(listOfDice.get(i).toString() + listOfDice.get(i).duplicate); }
*/
Iterator<Dice> iter = listOfDice.iterator();
while (iter.hasNext()) {
Dice elem = iter.next();
if (elem.toString().equals(tempDice.toString())) {
elem.duplicate++;
}
System.out.println(elem.toString() + elem.duplicate);
}
}
/**
* A method which checks if the combination entered is rolled.
*
* @param first first dice
* @param second second dice
*/
public void checkCombination(int first, int second) {
Dice checker = new Dice(first, second);
int index = 1;
boolean flag = false;
for (Dice diceObject : diceList) {
diceObject.rollArray = new String[diceList.toArray().length];
diceObject.rollArray[index - 1] = index + "";
for (int i = 0; i < diceList.size(); i++) {
if (diceObject.rollArray[i] == null) {
diceObject.rollArray[i] = "..";
}
}
if (diceObject.equals(checker)) {
System.out.println("Combination: (" + first + ", " + second + ") rolled on roll No: "
+ index);
flag = true;
}
index++;
}
if (!flag) {
System.out.println("Combination not rolled.");
}
}
/**
* A method which stores the data of the dice and each dice'.
*/
public void hashMapThingy() {
System.out.print("Roll: ");
for (int i = 0; i < rollingList.size(); i++) {
System.out.print((i + 1) + " ");
}
System.out.print("\n");
System.out.println("Comb:");
HashMap<Dice, String[]> hm = new HashMap<>();
for (Dice diceObject : diceList) {
hm.put(diceObject, diceObject.rollArray);
}
Set<Map.Entry<Dice, String[]>> set = hm.entrySet();
for (Map.Entry<Dice, String[]> me : set) {
System.out.println(me.getKey() + " " + Arrays.toString(printArray(me.getValue())));
}
}
/**
* Printer method.
*
* @param array array that contains the roll number
* @return returns the array string
*/
public String[] printArray(String[] array) {
return array;
}
}
public class Test {
/**
* Main function.
*
* @param args arguments
*/
public static void main(String[] args) {
int number = 5;
DiceRoller diceRoller = new DiceRoller();
diceRoller.rollDice(number);
// Dice.fillDiceList();
// Dice.printListDices();
diceRoller.checkCombination(3, 2);
diceRoller.checkCombination(1, 3);
diceRoller.checkCombination(6, 3);
diceRoller.hashMapThingy();
}
}
И текущий вывод консоли:
(5, 1)2
(5, 1)2
(1, 1)2
(5, 1)3
(1, 1)2
(5, 1)2
(5, 1)3
(1, 1)2
(5, 1)2
(1, 5)2
(5, 1)3
(1, 1)2
(5, 1)2
(1, 5)2
(4, 4)2
Combination not rolled.
Combination not rolled.
Combination not rolled.
Roll: 1 2 3 4 5
Comb:
(1, 1) [.., 2, .., .., ..]
(1, 5) [.., .., .., 4, ..]
(5, 1) [1, .., .., .., ..]
(5, 1) [.., .., 3, .., ..]
(4, 4) [.., .., .., .., 5]