Использование статической переменной в Java - PullRequest
0 голосов
/ 29 июня 2011

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

Но для печати в порядке самого стека мне нужна статическая переменная в Java.

public void display()
{
<STATIC> <here I need> LinkedListImp temp = this;

    while(temp.next!=null)
    {
     temp=temp.next;
     display();
     }

    System.out.println("\n\t"+ temp.element +"\n");;
}

Но, заявляя об этом, я получаю ошибку.

Я реализовал display () в концепции интерфейса. Следовательно, у меня не может быть отображения (LinkedListImp temp).

interface StackMethods
{
    int pop();
    void push(int numberint);
    void display();
}

Например, Если элементы стека 1, то 2, затем 3. Я не хотел выводить как 1 2 3 или 1 (новая строка) 2 (новая строка) 3.
Скорее хочу как 3 (перевод строки) 2 (новая строка) 1 (хотя для демонстрации реального стека не требуется)

Есть ли другой способ реализовать это?

Ответы [ 5 ]

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

Если вы хотите, чтобы значение temp не зависело от экземпляра родительского класса display() (LinkedListImp?), Вам понадобится переменная статического класса.В Java ключевое слово static отмечает переменную, которая принадлежит всему классу, а не отдельному экземпляру.Static в Java создает переменную, которая также известна как «переменная класса».По определению переменная класса не может быть локальной.Чтобы узнать больше о статических переменных, посмотрите, что должна сказать документация , или прочитайте этот вопрос StackOverflow, спецификация которого есть в ответе .

Но похоже, что вы пытаетесь использовать экземпляр класса, что означает, что вы не хотите статическую переменную.Вы абсолютно хотите, чтобы значение было привязано к классу.

Однако, чтобы это работало, вам необходимо заключить оба оператора в цикл while.В противном случае вы получите программу, которая перебирает все элементы связанного списка и печатает только последний.Это связано с тем, что в Java, если за оператором блока (if, else, for, while и т. Д.) Не следует фигурные скобки, он обрабатывает только следующую строку как содержимое блока.

public void display()
{
    LinkedListImp temp = this;
    while(temp.next!=null)
    {
        System.out.println("\n\t"+ temp.element +"\n");
        temp=temp.next;
    }
}

Чтобы изменить порядок здесь с помощью цикла, я бы использовал StringBuilder и собрал строку.

public void display()
{
    LinkedListImp temp = this;
    StringBuilder result = new StringBuilder();
    while(temp.next!=null)
    {
        result.insert(0, "\n\t"+ temp.element +"\n"); // put the result at the front
        temp=temp.next;
    }
    System.out.println(result.toString());
}

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

public display() {
   doDisplay(this);
}

private void doDisplay(LinkedListImpl item) {
    if(item.next) // implicit != null
    {
        doDisplay(item.next);
    }
    System.out.println("\n\t" + temp.element + "\n");  // this line goes before
                                                       // the if statement for
                                                       // regular ordering
}
0 голосов
/ 30 июня 2011

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

public void display()
{
    // Displays in reverse order. For forwards order, do it the other way around.
    if (next != null) { next.display(); }
    System.out.println("\n\t"+ element +"\n");
}
0 голосов
/ 29 июня 2011

Для печати списка в обратном порядке вы можете использовать вспомогательный метод:

public void display() {
    displayHelper(this);
}

private void displayHelper(LinkedListImp temp) {
    if (temp.next != null)
        displayInternal(temp.next);

    System.out.println("\n\t"+ temp.element +"\n");;
}
0 голосов
/ 29 июня 2011

static переменные объявляются как обычные переменные экземпляра с ключевым словом static.Это незаконно, чтобы объявить их в методе.Кроме того, почему бы просто не использовать this вместо присвоения его переменной?

0 голосов
/ 29 июня 2011

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

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