Я немного работал с 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 явно что-то мне не хватает. Как я могу разделить этот код на методы красивым способом только ради практики? + Если кто-нибудь знает о хорошем месте, чтобы просто прочитать о такой логике, я буду очень благодарен.
Заранее спасибо.
Вы можете добавить его как члена класса
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);
Переменная 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);
}
}
Здесь есть пара вопросов.
Test
(convention)ST
не является частью Java (в ваших комментариях вы пишете свою часть библиотеки, эта информация должна быть частью вопроса), то же самое для StdIn
и StdOut
.Чтобы решить ваш вопрос, есть несколько решений. 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);
}
}
addValue()
в классST
. Затем вы можете просто вызватьthis.put("P", 5);
внутриaddValue(..)
вместоst.put(..);
- также в основном методе вы можете сделатьST.addValue();
чтобы вызвать его - ИЛИ передать его как переменную, как показано ниже @DavidZhou :)