Как создать систематический список в Java? - PullRequest
1 голос
/ 12 апреля 2011

Привет, ребята, я пытаюсь создать генератор систематических списков на Java, но у меня возникла небольшая ошибка. Наш пример - пицца.

Проблема: Предположим, у вас есть всего 6 начинок для приготовления пиццы. Сколько вариаций 5 пицц можно сделать?

Так, например:

[пепперони, бекон, ананас, лук, грибы, перец] [Пепперони, бекон, ананас, лук, грибы, сыр] и т.д ...

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

public class SystematicList {

static String options[] = {
    "Pepperoni",
    "Bacon",
    "Cheese"
};

public static void main(String[] args) {

    /**
     * Generate a multi-dimensional array to represent the combinations of
     * pizza toppings we can possibly have from the available <code>options</code>
     *
     */
    String[][] combos = new String[3][2];

    /**
     * Ideally what we would like to create.
     * combos[0][0] = "Pepperoni";
     * combos[0][1] = "Bacon";
     * combos[1][0] = "Pepperoni";
     * combos[1][1] = "Cheese";
     * combos[2][0] = "Bacon";
     * combos[2][1] = "Cheese";
     */
    for (int pizzas = 0; pizzas < combos.length; pizzas++) {
        for (int toppings = 0; toppings < combos[pizzas].length; toppings++) {
            combos[pizzas][toppings] = options[0]; // <<< issue : element.
            System.out.print(" " + combos[pizzas][toppings]);
        }
        System.out.println("");
    }

    /*
     * Current Output :
     * run:
     *  Pepperoni Bacon
     *  Pepperoni Bacon
     *  Pepperoni Bacon
     * BUILD SUCCESSFUL (total time: 0 seconds)
     * 
     * ^ this is obvious, as I currently do not know how I'll select an
     * element from the array of topping options before/after a specified
     * index [example: 0 which would than range 1 - 2 apposed to 0 - 2
     * thus 'dropping' an optional element, making this much easier.
     *
     * Loop is virtually only doing the actions of :
     * 0 : 1,2
     * 1 : 1,2
     * 2 : 1,2
     */
}

}

Я решил создать 2D-список для хранения значений.

int [# возможных комбинаций] [# возможных значений]

Мой текущий код предполагает, что мы уже знаем возможные комбинации (хотя мы, конечно, не знаем), и независимо от того, что мы всегда можем определить значения (сколько 5, 4, 3, 2 пицц может быть построено)

Как я могу выбрать элемент из параметров [], при этом гарантируя, что никакой другой массив уже не содержит тех элементов, которые вы пытаетесь вставить. Я бы попробовал Arrays.contains или Arrays.equals, однако я бы не знал, что вставлять для сравнения, комбо [pizzas-1]?

if (!Arrays.contains(combos[pizzas], combos[pizzas-1]) {
combos[pizzas][toppings] = options[?];
}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2011

Я бы не использовал массив для хранения параметров пиццы.У вас есть 2 столбца для начинки.Что если я хочу пиццу с простым сыром?

Вот решение, которое использует рекурсию для создания пиццы с различным количеством начинок.

0 голосов
/ 12 апреля 2011

Один из способов - смотреть только на начинки, которые вы еще не рассматривали. Так, например, выбирая три начинки из [Пепперони, Бекон, Ананас, Лук, Грибы, Перец, Сыр], вы можете пропустить сыр, затем выбрать перец, затем пропустить грибы и лук и выбрать ананас и бекон. Конечно, вы должны оставить достаточно начинок, чтобы закончить пиццу, чтобы не пропускать сыр, перец, грибы, лук и ананас. Пример кода на JavaScript с использованием рекурсивного алгоритма, чтобы дать вам представление.

function combos(toppings, count) {
  var result = [];
  helper(result, [], toppings, toppings.length, count);
  return result;
}

function helper(result, selection, toppings, length, count) {
  if (count == 0) // no more toppings left to add
    result.push(selection); // this must be a solution
  else
    // start at --count because we need to be able to add other toppings
    for (var i = --count; i < length; i++)
      // add the selected topping to the selection
      // then consider toppings we haven't looked at yet
      helper(result, selection.concat([toppings[i]]), toppings, i, count);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...