Почему мой анализ не работает? - PullRequest
1 голос
/ 07 августа 2011

Меня попросили сделать домашнее задание, чтобы создать программу, в которой пользователь вводит римские цифры от 1 до 10 и выводит десятичный эквивалент. Поскольку я получу строку во входных данных и целое число в выходных данных, я проанализировал ее, но она не будет работать. Есть идеи почему?

import java.util.Scanner ;

class Romans {

    static Scanner s = new Scanner(System.in) ;
    static String val = null ;

    public static void main (String [] args)
    {
        System.out.print ("Enter a roman numeral between I to X: ");
        String val = s.nextLine();

        int e = Integer.parseInt(val);
    }
    static int getRoman (int e)
    {
        if (val = "I"){
            System.out.print ("1") ;
        }else if (val = "II" ){
            System.out.print ("2") ;
        }else if (val = "III") {
            System.out.print ("3") ;
        } else if (val = "IV") {
            System.out.print ("4") ;
        } else if (val = "V"){
            System.out.print ("5");
        } else if (val = "VI") {
            System.out.print ("6");
        } else if (val = "VII") {
            System.out.print ("7");
        } else if (val = "VIII") {
            System.out.print ("8");
        } else if (val = "IX") {
            System.out.print ("9");
        } else if (val = "X") {
            System.out.print ("10") ;
        }
        return val ;
    }
}

Ответы [ 8 ]

4 голосов
/ 07 августа 2011

Две точки:

  • = - это оператор присваивания, а не оператор проверки на равенство (==)
  • Вы не должны использовать == для проверкив любом случае для равенства строк, так как он проверяет только равенство reference ;используйте equals, чтобы проверить, относятся ли две строковые ссылки к равным (но потенциально отличным) строковым объектам.

Кроме того, вы пытаетесь вернуть переменную String какint, и вы даже не звоните getRoman ...

1 голос
/ 07 августа 2011

Вы пытаетесь проанализировать val как int, но это не его символ.

Для такой небольшой выборки символов, вероятно, проще всего создать таблицу поиска и проиндексировать ее на char.

1 голос
/ 07 августа 2011

Я думаю, мы можем сказать вам, что для сравнения строк используется правильный метод equals ().

Вы выполняете задания для сравнения типов примитивов, которые вы должны использовать ==, для сравнения метода String equals.

Пример:

if (val.equals ("I"))

Но также val не присутствует в методе getRoman ().

0 голосов
/ 07 августа 2011

Помимо того, что было сказано выше о том, как при сравнении строк следует использовать функцию equals (...) - например,

if ( val.equals("VII") )

, вам также необходимо указать возвращаемое значение для вашей функции с именем getRoman,Эта функция была объявлена ​​как функция, которая возвращает целочисленное значение вызывающей стороне, но в предоставленной вами реализации нет возвращаемых значений (только System.out.println (...)).

Кроме того, вы не вводите правильный тип параметра - исходя из того, как он выглядит, ваша функция проверяет строку, чтобы узнать, является ли она определенной римской цифрой.Таким образом, правильный заголовок функции будет выглядеть так:

public static int getRoman(String val)

Кроме того, убедитесь, что вы на самом деле вызываете эту функцию в своей функции main () - из того, как она выглядит сейчас, вы даже не используетеФункция getRoman ().

Надеюсь, это поможет!

0 голосов
/ 07 августа 2011

На самом деле ваша главная проблема заключается в сравнении строк.В java = предназначен для присваивания значений переменным, == предназначен для сравнения значений примитивных типов, а метод equals - это способ сравнения объектов, особенно для строк.

Альтернативой использованию equals может быть использованиевнутренний пул строк JDK, в этом случае вы можете использовать == в качестве компаратора.

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

И, наконец, если вы хотите выполнить настоящий синтаксический анализ всех римских чисел, а не только первых, то вам следует рассмотреть возможность использования автомата.то есть конечный автомат для анализа чисел несколько рекурсивным способом, который был бы более эффективной моделью для применения к вашей проблеме.

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

С уважением, Стефан

0 голосов
/ 07 августа 2011

Следующее утверждение является присваиванием:

val = "I"

Это определенно не , что вы хотите сделать здесь.

Сравнение выполняется с двойным равенством, но двойное равенство (==) сравнивает ссылки, но вы не хотите делать это и здесь.

Вы хотите использовать метод equals.

if (val.equals("I")) ...

Внести эти измененияповсюду и посмотрим, как это работает для вас.

0 голосов
/ 07 августа 2011

Сравнение строк должно выполняться методом equals(String str) вместо == сравнения.PS.В любом случае у вас есть = вместо ==.

0 голосов
/ 07 августа 2011

Вы получаете какие-либо ошибки?

В вашем коде вы никогда не вызываете функцию getRoman.Кроме того, вы используете оператор присваивания = вместо оператора сравнения «I» .equals (val), например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...