#java #data-structures #enumerator
#java #структуры данных #перечислитель
Вопрос:
Итак, вот моя структура перечисления.
public enum DictionaryEnum {
ARROW(
"Arrow",
new String[] {
"noun"
},
new String[] {
"Here is one arrow: <IMG> -=>> </IMG>"
}
),
BOOK(
"Book",
new String[]{
"noun",
"noun",
"verb",
"verb"
},
new String[]{
"A set of pages.",
"A written work published in printed or electronic form.",
"To arrange for someone to have a seat on a plane.",
"To arrange something on a particular date."
}
);
В основном, если пользователь вводит в книге обратное. На выходе должны быть определения слова book в обратном порядке.
Вот что у меня есть до сих пор:
String[] keywords = input.split(" ");
String key = keywords[0];
String[][] result = dictionary.get(key);
if (keywords[1].toLowerCase().equals("reverse") amp;amp; !keywords[1].toLowerCase().equals("distinct")) {
for (int i = DictionaryEnum.values().length - 1; i >= 0; --i) {
DictionaryEnum e = DictionaryEnum.values()[i];
System.out.println(e);
}
}
Но, как вы можете догадаться, он выводит обратную сторону всей структуры enum в отличие от обратного отдельного термина внутри структуры.
Например: если пользователь вводит «book», то вывод должен быть:
Book [noun] : A set of pages.
Book [noun] : A written work published in printed or electronic form.
Book [verb] : To arrange for someone to have a seat on a plane.
Book [verb] : To arrange something on a particular date.
если тип в «book reverse», вывод должен быть
Book [verb] : To arrange something on a particular date.
Book [verb] : To arrange for someone to have a seat on a plane.
Book [noun] : A written work published in printed or electronic form.
Book [noun] : A set of pages.
Комментарии:
1. Может быть, вы можете сказать нам, какой результат вы ожидаете? о, и еще:
if (keywords[1].toLowerCase().equals("reverse") amp;amp; !keywords[1].toLowerCase().equals("distinct"))
является излишне сложным и вообще не нуждается во второй части. В конце концов, еслиkeywords[1]
равно «reverse», оно не может быть равно ничему другому.2. спасибо за второй момент. И ожидаемый результат в случае команды: book reverse будет -> Book [существительное] : Набор страниц и т. Д. остальные определения, но в обратном порядке от последнего, являющегося первым, до первого, являющегося последним определением
3. Итак, вы хотите вывести свой массив строк в обратном порядке? Или все поля вашего перечисления? Должны ли сами строки быть изменены? Для меня это все еще неясно. Было бы намного проще, если бы вы просто добавили «Я хочу вывести ‘XXXX'» к вопросу. (Например, запишите фактический результат, который вы хотите, вместо того, чтобы просто описывать его)
4. @OHGODSPIDERS вопрос обновлен. Какие-либо указатели?
Ответ №1:
Поскольку вы опубликовали неполное перечисление, мне пришлось самому заполнить недостающие части. Поэтому имейте в виду, что имена и методы полей enum могут иметь другое имя, чем в вашем коде:
public enum DictionaryEnum {
ARROW(
"Arrow",
new String[] {
"noun"
},
new String[] {
"Here is one arrow: <IMG> -=>> </IMG>"
}
),
BOOK(
"Book",
new String[]{
"noun",
"noun",
"verb",
"verb"
},
new String[]{
"A set of pages.",
"A written work published in printed or electronic form.",
"To arrange for someone to have a seat on a plane.",
"To arrange something on a particular date."
}
);
private final String name;
private final String[] keys;
private final String[] values;
private DictionaryEnum(String name, String[] keys, String[] values) {
this.name = name;
this.keys = keys;
this.values = values;
}
public String getName() {
return name;
}
public String[] getKeys() {
return keys;
}
public String[] getValues() {
return values;
}
/**
* Will return the fitting DictionaryEnum for the passed name, or null if not found
* @param name
* @return
*/
public static DictionaryEnum getByName(String name) {
for (DictionaryEnum dictionaryEnum : values()) {
if(dictionaryEnum.getName().equalsIgnoreCase(name)) {
return dictionaryEnum;
}
}
return null;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Enter command:");
String input = scanner.nextLine();
String[] keywords = input.split(" ");
String name = keywords[0];
String command = keywords[1];
// 1. Use our static method to get the fitting enum:
DictionaryEnum dictionaryEnum = DictionaryEnum.getByName(name);
if (dictionaryEnum == null) {
// if the returned object was null no fitting match was found
System.out.println("NO ENUM FOUND!");
} else {
// 2. We found a fitting enum object! Lets use that object to iterate over its contents
if ("reverse".equals(command)) {
for (int i = dictionaryEnum.getKeys().length - 1; i >= 0; i--) {
String key = dictionaryEnum.getKeys()[i];
String value = dictionaryEnum.getValues()[i];
System.out.println(dictionaryEnum.getName() " [" key "] : " value);
}
} else {
for (int i = 0; i < dictionaryEnum.getKeys().length; i ) {
String key = dictionaryEnum.getKeys()[i];
String value = dictionaryEnum.getValues()[i];
System.out.println(dictionaryEnum.getName() " [" key "] : " value);
}
}
}
scanner.close();
}
}
Теперь большая часть того, что я добавил, — это простые методы получения / установки и конструктор, который должен быть более или менее идентичен тому, что у вас есть. Что, вероятно, интересно для вас, так это статический метод public static DictionaryEnum getByName(String name)
, который я добавил. Этот метод принимает строковый аргумент, а затем выполняет итерацию по всему существующему объекту enum. Он сравнивает переданный аргумент с полем name, и если он равен (игнорируя регистр), он вернет этот объект enum. Если цикл завершил выполнение, так и не найдя совпадения, вместо этого он вернет null.
Таким образом, вызов этого метода like DictionaryEnum.getByName("arrow");
вернет вам объект DictionaryEnum.ARROW
.
Существует много разных способов найти нужное перечисление с помощью ввода (другой пример см. В Ответе Fabian Tschachtli), но сначала вам нужно получить правильный объект enum, прежде чем вы сможете сделать что-либо еще.
Все, что вам нужно сделать, это использовать найденный объект enum для итерации по полям массива либо в обычном, либо в обратном порядке. Вы можете увидеть все это в основном методе, который я добавил, и запустить сам код.
Ответ №2:
Сначала вам нужно найти выбранный словарь:
DictionaryEnum de = DictionaryEnum.valueOf(keywords[0].toUpperCase());
После этого вы можете использовать структуру данных данного перечисления, чтобы распечатать то, что вы хотите.
В качестве примечания: я бы не стал использовать неизменяемую структуру данных для чего-то вроде словаря, поскольку, скорее всего, в будущем вы захотите добавить записи из других источников.
Комментарии:
1. Я пытался выполнить итерацию и отобразить в обратном порядке содержимое объекта enum. Например, если пользователь вводит «book reverse», я хочу изменить определения для слова book в обратном порядке.