Создайте рекурсивную функцию с Java, которая печатает все возможные последовательности элементов, содержащихся в списке. - PullRequest
0 голосов
/ 01 октября 2011

Я должен создать рекурсивную функцию в Java, которая распечатывает все возможные цвета из списка цветов.EG {r, b, g;r, g, b;g, r, b;g, b, r} и т.д ...

Мне кажется, я понял это, и мой код ниже.К сожалению, я продолжаю получать исключение нулевого указателя в базовом случае функции рекурсии, и оно никогда не запускается.Я включил тест в свой класс теста приложения, чтобы показать, что список цветов действительно создан.Я не уверен, что является причиной моей ошибки или где я допустил ошибку в своем коде.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SequentialPrint {
    private List colors;
    private List prefix;

    public SequentialPrint(List colors) {
        this.colors = colors;

    }

    public void printAllSequences(List colors) {
        int prefixCount = 0;
        int colorCount = 0;
        List prefix = new ArrayList();
        if (colors.isEmpty() || prefixCount == colors.size()) { //Base Case
            System.out.print("All Sequences Printed");
        }
        else {
            Object color = colors.remove(0);
            prefix.add(color); //add first color from colors list.
            prefixCount++; //increases prefix counter
            while (prefixCount <= colors.size() + 1) { //prints first rotation of colors
                System.out.println(prefix);
                System.out.print(colors);
                while (colorCount < colors.size() - 1) { //rotates list and prints colors, until entire list has been rotated once.
                    Collections.rotate(colors, 1);
                    System.out.println(prefix);
                    System.out.print(colors);
                }
            }
        }

    }

}



import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author Cash
 *
 */
public class SequentialPrintDemonstration {
    private SequentialPrint colorSequence;
    private List colorsList;
    private List prefixList;

    /**
     * @param args
     */
    public SequentialPrintDemonstration() {

        List colorsList = new ArrayList();

        colorsList.add("blue");
        colorsList.add("green");
        colorsList.add("red");
        colorsList.add("yellow");
        colorSequence = new SequentialPrint(colorsList);
        System.out.println(colorsList);


    }

    public void execute() {
        this.colorSequence.printAllSequences(colorsList);
    }

}

1 Ответ

1 голос
/ 01 октября 2011

У вашего класса есть закрытый элемент данных с именем prefix, который вы не инициализируете в конструкторе:

public class SequentialPrint {
    private List colors;
    private List prefix;

    public SequentialPrint(List colors){
        this.colors = colors;  // what if the array you pass in is null?
        // why not initialize prefix here?  it's null if you don't.
    }

Затем у вас есть метод, который объявляет локальную переменную List с префиксом:

public void printAllSequences(List colors){
    int prefixCount = 0;
    int colorCount = 0;
    List prefix = new ArrayList();  // this one shadows the private data member

Вы хотите использовать здесь элемент личных данных?

Почему вы переходите в цвета? Как это связано с личным членом данных?

Я не понимаю этот код после быстрого взгляда. Вы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...