Преобразование строки в int - PullRequest
1 голос
/ 18 января 2012

Короче говоря, нижеприведенные фрагменты о преобразовании текстового месяца в номер (например, январь -> 1). Там нет ошибки, но в конце я получаю 0 в результате m. Где проблема?

//date1s[] is the result of splitting date1 by spaces (date1 = 1 Jan 2012)
m = convertMonth(date1s[1]); //date1s[1] contains the Month; date1s[0] the date and date1s[2] the year

public int convertMonth(String monw) {
        int x = 0;
        if (monw == "Jan") {
            x = 1;
        }
        else if (monw == "Feb") {
            x = 2;
        } 
        else if (monw == "Mar") {
            x = 3;
        } 
        else if (monw == "Apr") {
            x = 4;
        } 
        else if (monw == "May") {
            x = 5;
        } 
        else if (monw == "Jun") {
            x = 6;
        } 
        else if (monw == "Jul") {
            x = 7;
        } 
        else if (monw == "Aug") {
            x = 8;
        } 
        else if (monw == "Sep") {
            x = 9;
        } 
        else if (monw == "Oct") {
            x = 10;
        } 
        else if (monw == "Nov") {
            x = 11;
        } 
        else if (monw == "Dec") {
            x = 12;
        }
        return x;
}    

Ответы [ 7 ]

4 голосов
/ 18 января 2012

Используйте метод .equals() для String.

if (monw.equals("Jan"))

При использовании оператора == он сравнивает ячейки памяти двух объектов и возвращает false.Другими словами, он возвращает true, только если один и тот же объект находится по обе стороны уравнения.Поэтому вы должны использовать метод .equals(), который возвращает true, если два разных объекта имеют одно и то же значение.

EDIT: Я только что проверил, @LazyCubicleMonkey прав.Оператор == проверяет, совпадают ли места в памяти.Я создал класс, переопределил метод hashCode(), создал два объекта и напечатал obj1==obj2.Это печатает false.

4 голосов
/ 18 января 2012

Вместо выполнения

if (monw == "Jan") {
            x = 1;
        }

Использование,

if (monw.equals("Jan")) {
            x = 1;
        }
3 голосов
/ 18 января 2012

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

В вашем случае, , если ваши названия месяцев постоянны , будет лучше , чтобы использовать Map<String,Integer> названий месяцев и значенийили Enum с названиями месяцев.Он пропустит ваши длинные условия if...else..if...else.


Пример перечисления:

public enum Month {
    Jan,
    Feb,
    Mar,
    Apr,
    // ...
    Dec
}    
public int toMonthInt(String input) {
    return Month.valueOf(input).ordinal() + 1; // +1 because you want Month value to start with 1.
}

Пример карты:

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("Jan", 1);
    map.put("Feb", 2);
    map.put("Mar", 3);
    map.put("Apr", 4);
    // ...
    map.put("Dec", 12);
    System.out.println(map.get("Jan"));
3 голосов
/ 18 января 2012

Вы используете == вместо equals() для сравнения строк.

2 голосов
/ 18 января 2012

В Java7 вы можете использовать оператор switch вместо if-else. Он также поддерживает String.

1 голос
/ 18 января 2012
if ("Jan".equals (monw))
{  
     x = 1;
}
0 голосов
/ 18 января 2012

Еще один подход - хранить имена в списке:

List <String> as = Arrays.asList ("Jan", "Feb", "Mar");
System.out.println (as.indexOf ("Feb")); 
System.out.println (as.indexOf ("Fex")); 

Первый возвращает 1, второй -1. Для вас вы бы добавили +1 к основанному на 0 индексу и проверили, чтобы он не был 0 в конце или -1 в начале.

Я не уверен, работает ли это на Blackberry.

...