Используете java .util.Map и java .util.LinkedHashMap?

Я новичок в 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, чтобы увидеть, соответствует ли ввод любому из перечисленных значений. Либо я что-то упускаю из виду, либо мне нужен совсем другой метод.

Я думаю, вы хотели написать table.containsKey (romaji), поскольку romaji - это строка, которую вы предоставляете.

Ajris 07.09.2018 23:43

Ага, это простая опечатка. Если вы замените roma на romaji в .containsKey и .get, он будет работать нормально.

that other guy 07.09.2018 23:46

Относительно причин, по которым это не вызывает ошибку времени компиляции (которая спасла бы вас от ошибки времени выполнения - и задать вопрос): Каковы причины, по которым Map.get (ключ объекта) не (полностью) универсальный.

Mick Mnemonic 07.09.2018 23:51

Извините, что потратил время на такую ​​простую опечатку. По крайней мере, вы не потратили целый час на просмотр документации (просто чтобы понять, что все время это был час опечаток). (: Я обязательно проверю, почему использование Map.get () не дает мне ошибки времени компиляции (в этом случае было бы неплохо).

Allan Boswell 08.09.2018 00:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
265
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

На вашей карте есть строковые ключи, а указанная вами строка находится в переменной romaji. Итак, ваш if должен выглядеть так: if (table.containsKey(romaji)). Более того, в этой ситуации я думаю, что использование LinkedHashMap ничего вам не даст, простой HashMap будет так же хорош, как LinkedHashMap (даже лучше), потому что вам не нужно поддерживать порядок вставки ваших персонажей.

И тебе спасибо! Вы правы, мне не нужно использовать LinkedHashMap, когда HashMap был бы более идеальным в этой ситуации.

Allan Boswell 08.09.2018 00:07
Ответ принят как подходящий

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

Вы написали 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();

Большое спасибо. Не могу поверить, что я пропустил это, вставив рома вместо ромадзи. И спасибо за дополнительную информацию о перезапуске сканера после ввода неправильного символа. :)

Allan Boswell 08.09.2018 00:05

Да, вы должны быть особенно осторожны с очень похожими именами переменных.

faris 08.09.2018 00:06

Другие вопросы по теме