Правильный способ обработки «контрольного списка» предметов - PullRequest
0 голосов
/ 19 июня 2011

У меня есть процесс, который должен выполнить ряд задач. Возможно, что процесс попытается выполнить попытку задачи, которая уже была завершена, и в этом случае он должен проигнорировать эту попытку и сгенерировать запрос для выполнения другой задачи. Я не уверен в хорошем способе отслеживать, какие задачи выполнены, а какие еще необходимо обработать.

Я буду использовать игру «Яхтзе» в качестве примера, чтобы продемонстрировать, как я в настоящее время справляюсь с этим. Сначала я создаю список задач, в данном случае комбинаций выигрыша:

combinations = new ArrayList<String>();
combinations.add("one");
combinations.add("two");
...
combinations.add("fullhouse");
combinations.add("smallstraight");
combinations.add("yahtzee");
...

Когда игрок использует одну из этих комбинаций, я удаляю ее из массива, в данном случае «небольшую прямую» комбинацию:

public void selectSmallStraight() {
    int index = combinations.indexOf("smallstraight");
    if(index < 0)
        System.out.println("Small Straight already used");
        //Prompt the player for another selection
    else
        combinations.remove(index);
        score += 30;
}

Как только все комбинации были использованы, игра заканчивается.

Использование списка массивов мне кажется очень примитивным, не говоря уже об уродстве. Я подумал об использовании Map<String, Boolean>, а затем просто пометил объект как ложный после его использования, но я бы предположил, что уже есть какой-то «стандартный» способ сделать это гораздо более элегантным.

Ответы [ 2 ]

2 голосов
/ 19 июня 2011

Если примитивное решение работает, то зачастую это лучшее решение. Зачем усложнять?

Единственный недостаток, который я вижу при использовании только ArrayList - это медленный поиск в нем. Использование Map для этого было бы лучше.

Но может быть даже лучше, если вы создадите класс, который знает, использовался ли он уже, и поместите его в карту.

1 голос
/ 21 июня 2011

Ваш пример arraylist может быть немного неэффективным для того, что вы делаете, и он может случайно ошибиться в действии.Если у вас есть заданное количество действий, почему бы не сохранить их в логическом массиве?

final static int FIRSTACTION = 0;
final static int SECONDACTION = 1;
final static int LASTACTION = 2;
boolean[] actionsFinished = new boolean[3];

Тогда вы можете установить его после окончания:

//Do first action code goes here
actionsFinished[FIRSTACTION] = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...