Я новичок в Java (а также в программировании в целом). Я работал над личным проектом, в котором пользователь вводит один символ, в который он конвертируется в другой символ. Более конкретно, пользователь должен ввести латинизацию японского символа, для которого выводится эквивалент японской хираганы. Сейчас я использую два отдельных класса:
RomaHiraCore.java
import java.util.*;
public class RomaHiraCore
{
public static void main(String[] args)
{
Table.initialize(); // Table.java needed!
Map<String, String> table = Table.getTable();
Scanner roma = new Scanner(System.in);
System.out.println("Romaji: ");
String romaji = roma.nextLine().toLowerCase();
if (table.containsKey(roma))
{
System.out.println(table.get(roma));
}
else
{
System.out.println("Please enter a valid character (e. g. a, ka)");
}
roma.close();
}
}
Tables.java
import java.util.*;
public class Table
{
private static Map<String, String> table = new LinkedHashMap<>();
public static Map<String, String> getTable()
{
return table;
}
public static void initialize()
{
// a - o
table.put("a", "あ");
table.put("i", "い");
table.put("u", "う");
table.put("e", "え");
table.put("o", "お");
// ka - ko
table.put("ka", "か");
table.put("ki", "き");
table.put("ku", "く");
table.put("ke", "け");
table.put("ko", "こ");
}
}
Если кто-нибудь может указать мне правильное направление, я был бы очень признателен. Я попытался просмотреть документацию, но, похоже, не могу ее понять (возможно, я слишком много над этим думаю). Когда я запускаю программу, она позволяет мне вводить символ; однако он продолжит только оператор "else", а не будет сканировать Table.java, чтобы увидеть, соответствует ли ввод любому из перечисленных значений. Либо я что-то упускаю из виду, либо мне нужен совсем другой метод.
Ага, это простая опечатка. Если вы замените roma на romaji в .containsKey и .get, он будет работать нормально.
Относительно причин, по которым это не вызывает ошибку времени компиляции (которая спасла бы вас от ошибки времени выполнения - и задать вопрос): Каковы причины, по которым Map.get (ключ объекта) не (полностью) универсальный.
Извините, что потратил время на такую простую опечатку. По крайней мере, вы не потратили целый час на просмотр документации (просто чтобы понять, что все время это был час опечаток). (: Я обязательно проверю, почему использование Map.get () не дает мне ошибки времени компиляции (в этом случае было бы неплохо).




На вашей карте есть строковые ключи, а указанная вами строка находится в переменной romaji. Итак, ваш if должен выглядеть так: if (table.containsKey(romaji)). Более того, в этой ситуации я думаю, что использование LinkedHashMap ничего вам не даст, простой HashMap будет так же хорош, как LinkedHashMap (даже лучше), потому что вам не нужно поддерживать порядок вставки ваших персонажей.
И тебе спасибо! Вы правы, мне не нужно использовать LinkedHashMap, когда HashMap был бы более идеальным в этой ситуации.
В вашем основном методе вы в настоящее время храните строковое значение, введенное пользователем, однако вы никогда не получите доступ к этой переменной где-либо еще.
Вы написали table.containsKey(roma), однако roma - это объект сканера, а не строка, которую они ввели, поэтому вы должны проверить, является ли эта строка допустимым ключом, используя table.containsKey (romaji).
Затем в предложении else вы просите их повторно ввести ввод, но никогда не предоставляете им возможности сделать это, потому что вы просто завершаете работу сканера.
Вам следует сделать что-то вроде этого.
String romaji = roma.nextLine().toLowerCase();
while (true) {
if (table.containsKey(romaji)) {
System.out.println(table.get(romaji));
break;
}
else {
System.out.println("Enter a valid char:";
romaji = roma.nextLine().toLowerCase();
}
}
roma.close();
Большое спасибо. Не могу поверить, что я пропустил это, вставив рома вместо ромадзи. И спасибо за дополнительную информацию о перезапуске сканера после ввода неправильного символа. :)
Да, вы должны быть особенно осторожны с очень похожими именами переменных.
Я думаю, вы хотели написать table.containsKey (romaji), поскольку romaji - это строка, которую вы предоставляете.