Как я могу заставить этот код функционировать так же без конструктора? - PullRequest
0 голосов
/ 14 апреля 2019

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

Я не очень знаком с программированием, поэтому я попытался посмотреть на предыдущие вопросы.Почему-то я думал об использовании вложенного класса (не уверен, как они работают), но безрезультатно.Метод работал, когда он был в своем собственном классе.

// Should be within a class

private PrintWriter _pw;

// This is the part that needs to go.
public HeapAlgo(PrintWriter pw) {
   this._pw = pw;
}

public void heapPermutation(String a[], int size, int n) throws IOException { 
// if size becomes 1 then prints the obtained 
// permutation 
    if (size == 1) 
        for (int i=0; i<n; i++) { 
            System.out.println(a[i] + "");
            this._pw.println(a[i] + ""); 
        }

    for (int i=0; i<size; i++) { 
        heapPermutation(a, size-1, n); 

        // if size is odd, swap first and last 
        // element 
        if (size % 2 == 1) { 
            String temp = a[0]; 
            a[0] = a[size-1]; 
            a[size-1] = temp; 
        }

        // If size is even, swap ith and last 
        // element 
        else { 
           String temp = a[i]; 
           a[i] = a[size-1]; 
           a[size-1] = temp; 
        } 
    }

}

public void heap() throws IOException 
{
FileWriter fw = new FileWriter("note.txt");
PrintWriter pw = new PrintWriter(fw);
File temp = new File("code.txt");
Scanner file = new Scanner(temp);

String substring = "";

    String a[] = new String[4];
  a[0] = "" + file.nextLine(); 
  a[1] = "" + file.nextLine();
  a[2] = "" + file.nextLine();
  a[3] = "" + file.nextLine();



HeapAlgo obj = new HeapAlgo(pw); // Pass in a writer
obj.heapPermutation(a, a.length, a.length);
pw.close();
} 

Когда я запускаю методы внутри большого класса, я получаю сообщение об ошибке: «ошибка: недопустимое объявление метода; требуется возвращаемый тип».

Любая помощь будет принята с благодарностью.Спасибо.

Редактировать: я пытаюсь кодировать этот конструктор:

    public CodeRunner() 
    { 
    random(); 
    HeapAlgo.heap(//not sure if anything should go here); 
    algorithm(); 
    }

, где random () создает случайные строки, а функция алгоритма выполняет алгоритм на всех возможных итерациях случайной строки,Я пытаюсь сделать объекты для каждого набора случайных строк.

1 Ответ

0 голосов
/ 14 апреля 2019

Кажется, что следующие элементы должны быть внутри класса с именем HeapAlgo:

  1. Объявление закрытой переменной
private PrintWriter _pw;
Сам конструктор
public HeapAlgo(PrintWriter pw)
Функция heapPermutation
public void heapPermutation(String a[], int size, int n) throws IOException

Последний оставшийся метод, heap(), должен быть помещен в какой-то другой класс (возможно, где находится ваша функция main()) и вызываться оттуда.

В качестве альтернативы, вы действительно можете использовать внутренний класс.Оберните весь код, который вы указали в классе (возможно, под названием Heap), затем оберните вышеупомянутые три элемента во внутренний класс под названием HeapAlgo.Примерно так (я очень быстро это напечатал, поэтому могут быть ошибки, которые нужно исправить):

public class HeapUtil {
    public class HeapAlgo {
        private PrintWriter _pw;

        // This is the part that needs to go.
        public HeapAlgo(PrintWriter pw) {
           this._pw = pw;
        }

        public PrintWriter getPrintWriter(){
            return _pw;
        }

        public void heapPermutation(String a[], int size, int n) throws IOException { 
        // if size becomes 1 then prints the obtained 
        // permutation 
            if (size == 1) 
                for (int i=0; i<n; i++) { 
                    System.out.println(a[i] + "");
                    this._pw.println(a[i] + ""); 
                }

            for (int i=0; i<size; i++) { 
                heapPermutation(a, size-1, n); 

                // if size is odd, swap first and last 
                // element 
                if (size % 2 == 1) { 
                    String temp = a[0]; 
                    a[0] = a[size-1]; 
                    a[size-1] = temp; 
                }

                // If size is even, swap ith and last 
                // element 
                else { 
                   String temp = a[i]; 
                   a[i] = a[size-1]; 
                   a[size-1] = temp; 
                } 
            }
        }
    }

    public static HeapAlgo heap() throws IOException 
    {
        FileWriter fw = new FileWriter("note.txt");
        PrintWriter pw = new PrintWriter(fw);
        File temp = new File("code.txt");
        Scanner file = new Scanner(temp);

        String substring = "";

        String a[] = new String[4];
        a[0] = "" + file.nextLine(); 
        a[1] = "" + file.nextLine();
        a[2] = "" + file.nextLine();
        a[3] = "" + file.nextLine();

        HeapAlgo obj = new HeapAlgo(pw); // Pass in a writer
        obj.heapPermutation(a, a.length, a.length);
        return obj;
    }
}

Обратите внимание, что в этом случае, если вы хотите использовать HeapAlgo вне этого классафайл, вам нужно будет использовать Heap.HeapAlgo.


Редактировать: Попробуйте приведенный выше код (я его редактировал).Может быть несколько ошибок, поскольку я на самом деле не запускал его.

Использование выглядит следующим образом:

public CodeRunner(){ 
    random(); 
    // heapAlgo is the heap object
    HeapAlgo heapAlgo = HeapUtil.heap(); 
    // this gives you access to the PrintWriter inside the HeapAlgo
    PrintWriter printWriter = heapAlgo.getPrintWriter();
    // do your other stuff
    algorithm(); 
}
...