Я пишу программу для некоторых программ викторины. У меня есть класс вопросов, содержащий ArrayLists для вопроса, ответа, опций, отметок и отрицательных отметок. Что-то вроде этого:
class question
{
private ArrayList<Integer> index_list;
private ArrayList<String> question_list;
private ArrayList<String> answer_list;
private ArrayList<String> opt1_list;
private ArrayList<String> opt2_list;
}
Я хочу перетасовать все вопросы, но для перетасовки вопросов необходимо перетасовать все объекты. Я бы подошел к этой проблеме следующим образом:
Прежде всего, я бы не использовал этот дизайн и не использовал ArrayList<String>
тип String в качестве переменных экземпляра, а затем использовал бы Collections.shuffle
метод для перемешивания объектов. Но моя команда настаивает на этом дизайне.
Теперь класс вопросов содержит растущие списки ArrayLists по мере ввода вопросов. Как перетасовать вопросы сейчас?
java
collections
user1369975
источник
источник
Ответы:
Ваша команда страдает от общей проблемы: отказ объекта .
Вместо класса, который содержит один вопрос со всей информацией, связанной с ним, вы пытаетесь создать класс с именем,
question
который содержит все вопросы в одном экземпляре.Это неправильный путь, и это усложняет то, что вы пытаетесь сделать много ! Сортировка (и перетасовка) параллельных массивов (или списков) - это неприятное дело, и для него нет единого API, просто потому, что вы обычно этого вообще избегаете .
Я предлагаю вам реструктурировать свой код следующим образом:
Таким образом, перетасовка вашего вопроса становится тривиальной (использование
Collections.shuffle()
):источник
Вы не Вы создаете другой список / очередь индексов и перемешиваете это. Затем вы перебираете индексы, которые управляют «перемешанным» порядком ваших других коллекций.
Даже за пределами вашего сценария с разделенными вещами отдельный сбор заказов обеспечивает ряд преимуществ (параллелизм, скорость переустановки исходного набора дорогостоящая и т. Д.).
источник
Я согласен с другими ответами, что правильное решение состоит в том, чтобы использовать правильную объектную модель.
Однако на самом деле довольно легко перетасовать несколько списков одинаковым образом:
источник
Создать класс
Question2
:Затем создайте функцию отображения а
question
дляArrayList<Question2>
, использованияCollection.Shuffle
для этого результата, и создать вторую функцию для отображенияArrayList<Question2>
обратно вquestion
.После этого обратитесь к своей команде и попытайтесь убедить их, что использование
ArrayList<Question2>
вместо этого значительноquestion
улучшит их код, поскольку это избавит их от многих ненужных преобразований.источник
Мой оригинальный наивный и неправильный ответ:
Обновить:
Спасибо за the_lotus за указание на статью об ужасах кодирования. Теперь я чувствую себя намного умнее :-) В любом случае, Джефф Этвуд также показывает, как это сделать правильно, используя алгоритм Фишера-Йейтса :
Основное отличие здесь заключается в том, что каждый элемент заменяется только один раз.
И хотя другие ответы правильно объясняют, что ваша объектная модель имеет недостатки, вы не можете быть в состоянии изменить ее. Таким образом, алгоритм Фишера-Йейтса решит вашу проблему без изменения модели данных.
источник