Java: базовая логика Java

1

Я немного работал с java, но есть такие небольшие логические вещи, которые, кажется, я никогда не понимаю, и я приведу пример сразу. У меня есть этот код:

class test {

public static void main(String[] args) {
    ST<String, Integer> st;
    st = new ST<String, Integer>();

    for (int i = 0; !StdIn.isEmpty(); i++) {
        String key = StdIn.readString();
        st.put(key, i);
    }

    st.put("P", 5); // Put method

    for (String s : st.keys()) {
        StdOut.println(s + " " + st.get(s));
    }

  }
}

Поэтому он создает таблицу символов и вставляет в нее некоторые данные из предоставленного файла. Как вы можете видеть, у меня есть метод put, который вставляет значение 5 в ключ "P". Я хочу создать метод для этого только ради практики. Итак, что я делаю:

public static void addValue() {
    st.put("P", 5);
}

и вызывать этот метод вместо метода "put" в моем коде. Однако я не могу скомпилировать это, так как метод "addValue" не знает переменную st.

Затем я подумал о том, чтобы поставить эти две строки:

ST<String, Integer> st;
st = new ST<String, Integer>();

в конструктор класса, но это не получилось. Может кто-то, пожалуйста, объяснит некоторую логику этого, потому что theres явно что-то мне не хватает. Как я могу разделить этот код на методы красивым способом только ради практики? + Если кто-нибудь знает о хорошем месте, чтобы просто прочитать о такой логике, я буду очень благодарен.

Заранее спасибо.

  • 0
    Начните с чтения о переменной области: java-made-easy.com/variable-scope.html
  • 0
    вам нужно добавить метод addValue() в класс ST . Затем вы можете просто вызвать this.put("P", 5); внутри addValue(..) вместо st.put(..); - также в основном методе вы можете сделать ST.addValue(); чтобы вызвать его - ИЛИ передать его как переменную, как показано ниже @DavidZhou :)
Показать ещё 4 комментария
Теги:

3 ответа

2

Вы можете добавить его как члена класса

class test {

    private static ST<String, Integer> st;

    public static void main(String[] args) {
         st = new ST<String, Integer>();

        for (int i = 0; !StdIn.isEmpty(); i++) {
            String key = StdIn.readString();
            st.put(key, i);
        }

        addValue();

        for (String s : st.keys()) {
            StdOut.println(s + " " + st.get(s));
        }

    }

    public static void addValue() {
        st.put("P", 5);
    }
}

или передать его как переменную

public static void addValue(ST<String, Integer> st) {
    st.put("P", 5);
}

Затем из основного метода вы можете просто позвонить

addValue(st);
2

Переменная st известна только основному методу, потому что вы ее там объявили. Чтобы разрешить доступ к другим методам, вы должны создать член класса. Вот класс, который должен делать то, что вы хотите:

class test {

    private static ST<String, Integer> st;

    public static void main(String[] args) {
        st = new ST<String, Integer>();

        for (int i = 0; !StdIn.isEmpty(); i++) {
            String key = StdIn.readString();
            st.put(key, i);
        }

        addValue();

        for (String s : st.keys()) {
            StdOut.println(s + " " + st.get(s));
        }

    }

    public static void addValue() {
        st.put("P", 5);
    }
}
  • 0
    Это действительно хороший момент, это то, что я тоже ищу. Сейчас я попробовал другой способ добиться того, чего хочу, и это действительно отличный способ выучить логику. Спасибо!
  • 0
    о, кстати, чтобы это помогло, частное поле "ST" должно быть статическим. Я не уверен, почему, хотя?
Показать ещё 1 комментарий
1

Здесь есть пара вопросов.

  1. Имена классов должны быть в верхнем регистре, в этом случае Test (convention)
  2. Класс с основным методом должен быть общедоступным (условным)
  3. ST не является частью Java (в ваших комментариях вы пишете свою часть библиотеки, эта информация должна быть частью вопроса), то же самое для StdIn и StdOut.
  4. Ваш класс находится в пакете по умолчанию, это нормально для теста.

Чтобы решить ваш вопрос, есть несколько решений. BlithE уже показал вам один, другой упоминается Дэвидом Чжоу в комментарии:

// missing ST StdIn and StdOut, they probably need too be imported
public class Test {

    public static void main(String[] args) {
        ST<String, Integer> st;
        st = new ST<String, Integer>();

        for (int i = 0; !StdIn.isEmpty(); i++) {
            String key = StdIn.readString();
            st.put(key, i);
        }

        addValue(st);

        for (String s : st.keys()) {
            StdOut.println(s + " " + st.get(s));
        }

    }

    public static void addValue(ST<String, Integer> st) {
        st.put("P", 5);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню