Разбор строки в методе Java - PullRequest
       76

Разбор строки в методе Java

1 голос
/ 02 декабря 2010

Я совершенно новичок в Java, поэтому извините, если ответ на этот вопрос кажется очевидным ...

Я написал метод в своем классе следующим образом:

private static final String[] rCode = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}

  private int getCharValue(String code)
  {
    // loop through the codes to find a
    // matching code, if found exit loop (via return).
    for (int position = 0; position < rCode.length; position++)
    {
      if (rCode[position] == code)
        return rVal[position];
    } // for

    // otherwise return 0
    return 0;
  } // getCharValue

В другом методе того же класса я перебираю символы строки следующим образом:

String number = "MMMCDXXXIV";

for (int pos = 0; pos < number.length(); pos++)
{ 
  System.out.println(number.substring(pos, pos + 1) + " " + getCharValue(number.substring(pos, pos + 1)));
} // for

Моя проблема в том, что хотя мой метод getCharValue () работает нормально, когда я жестко кодирую значение в, например, getCharValue("X") это не работает, когда я называю это как getCharValue(number.substring(pos, pos + 1)) (хотя я знаю, что number.substring(pos, pos + 1) возвращает одиночные символы, которые должны возвращать значения.

Может кто-нибудь увидеть мою очевидную ошибку?

Большое спасибо ...

Ответы [ 4 ]

4 голосов
/ 02 декабря 2010
if (rCode[position] == code)

Это не делает то, что вы хотите в Java.Это не сравнение, если символы, составляющие строку, одинаковы, это сравнение, если два объекта String фактически являются одним и тем же объектом.Так что это работает, когда вы сравниваете два литерала времени компиляции, потому что компилятор достаточно умен, чтобы указывать им на один и тот же внутренний объект.Тем не менее, когда вы генерируете новые строки во время выполнения, это не удастся.

Вы хотите сделать:

if (rCode[position].equals(code))
3 голосов
/ 02 декабря 2010

Одной из проблем является использование == для сравнения строк вместо string1.equals(string2);
==, чтобы определить, являются ли 2 одинаковыми объектами, .equals проверяет, имеют ли они одинаковое содержимое.

1 голос
/ 02 декабря 2010

Сравнение двух строк с == позволит сравнить объекты.Поскольку Java кэширует литералы String, он будет работать при передаче литерала String, как вы видите при использовании getCharValue ("X").Правильный подход заключается в использовании rCode[position].equals(code);.equals() сравнивает содержимое строк, что вы и хотите.Вы также можете захотеть equalsIgnoresCase(), который игнорирует регистр при сравнении строк.

Однако я бы предложил вместо этого изменить код для сравнения символов.Измените getCharValue() на char, а затем используйте rCode.charAt(position) для доступа к отдельному персонажу из rCode.Также используйте charAt при вызове нового getCharValue() вместо использования substring().

РЕДАКТИРОВАТЬ: То, что я сказал об использовании символов, терпит неудачу, так как узнав, что rCode содержит строки с несколькими символами.Однако, как уже упоминалось в комментарии выше, я вижу проблемы с этим.

0 голосов
/ 02 декабря 2010

Я не уверен, что понимаю, чего вы здесь добиваетесь, но если вы пытаетесь проверить, есть ли в вашей строке подстрока, возможно, вы захотите проверить метод .contains(): http://download.oracle.com/javase/6/docs/api/java/lang/String.html#contains(java.lang.CharSequence)

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