"И смех и грех": не работает сравнение строк

Ответить
ZipovUA
Сообщения: 15
Зарегистрирован: 07 май 2012, 11:17

"И смех и грех": не работает сравнение строк

Сообщение ZipovUA » 30 авг 2012, 09:33

Доброго времени суток!

У меня есть абсурдная проблема, с которой я не смог разобратся.

Суть в чем: есть команда, которая получает имя телефонного оператора.
Полученое имя мы проверяем: если "Beeline" - такие-то действия, если MTS - то другие.
Название оператора на ура вытягиваеться, но в if программа всё равно не входит

Код: Выделить всё

android.telephony.TelephonyManager telManager= (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            
            if (telManager.getSimOperatorName()=="life:)"){Log.d("test simOperatorName", telManager.getSimOperatorName());}
            java.lang.String codeStr="";
            Log.d("testMessages1",telManager.getNetworkOperatorName());
            if (telManager.getNetworkOperatorName()=="life:)")
            {
            	Log.d("testMessages", "Ми в функції life:)");
            	codeStr="*111";            	
            }
сама строка названия оператора "life:)" взята из предыдущей комманды (в логах). Тоесть я её попросту скопипастил.
Таким образом по логике левая и правая часть условия должны совподать.
Но в реальной жизни мы в наш блок условия так и не попадаем...

Прошу озвучить варианты как разобратся с такой ситуацией.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: "И смех и грех": не работает сравнение строк

Сообщение rezak90 » 30 авг 2012, 09:44

строки так не сравнивают, String это объект, в котором есть не мало методов equals для сравнения объектов и строковых String'ов. И во вторых в android'e это ещё не правильный подход, правильным будет вынести строки life, mts и т.д. в ресурсы и потом вытягивать их для сравнения getString(R.string.life)
R.id.team
Политика на форуме запрещена

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: "И смех и грех": не работает сравнение строк

Сообщение KamiSempai » 30 авг 2012, 10:15

rezak90 писал(а):И во вторых в android'e это ещё не правильный подход, правильным будет вынести строки life, mts и т.д. в ресурсы и потом вытягивать их для сравнения getString(R.string.life)
Не знаю как правильно, но я подобные значения в константы забиваю. Текстовые ресурсы использую только для строк используемых в пользовательском интерфейсе.

PS: В андроиде строки вообще странная вещь, вроде объект, а, например, команда mArrayList.remove("string1"), где mArrayList это ArrayList<String>, выполняется без проблем.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: "И смех и грех": не работает сравнение строк

Сообщение rezak90 » 30 авг 2012, 10:20

В ресурсы иногда выносят если много текста, и если особенно нужна локализация, если текста не много то проще конечно в коде обьявить. И дело не в андроиде, а в яве, в яве нету типа String, это объект, и часто путают с С++, там это тип.
И по этому когда сравниваем String с "hello world" то идёт сравнивание уже не объекта String c String, а объекта String с char. Как то так если я не ошибаюсь.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: "И смех и грех": не работает сравнение строк

Сообщение Mikhail_dev » 30 авг 2012, 10:29

В документации к ArrayList
remove(Object o)
Removes the first occurrence of the specified element from this list, if it is present.
Другими словами, если arraylist найдет объект, равный вашему string1, то она удалит его, причем удалит первый встретившийся. Так что далеко не факт, что вы удалите нужный вам объект. Вдруг у вас будет два идентичных объекта.
Не знаю как правильно, но я подобные значения в константы забиваю. Текстовые ресурсы использую только для строк используемых в пользовательском интерфейсе.
Вот потом что-то типа этого должно получится

Код: Выделить всё

if ( receiveString.equals( getString(R.string.life) ) ) { //TODO}
или же там есть еще что-то типа не учитывать регистр

Код: Выделить всё

if ( receiveString.equalsIgnoreCase( getString(R.string.life) ) ) { //TODO}
А на счет странности... Ничего не могу сказать, особо на других языках много ре работал. В Java всё является объектами, так что если вы и хотите в дальнейшем на ней писать, то стоит изучить досконально сравнение объектов, как и их клонирование.
Integer a = 2; - это тоже объект. И по сути он тоже не будет равен Integer b = 2;
А вот int a = 2; будет равно int b = 2;

Ой, невнимателен был в прочтении =) Подумал что KamiSempai автор. Но пусть будет)

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: "И смех и грех": не работает сравнение строк

Сообщение AndreyI » 30 авг 2012, 10:36

rezak90 писал(а): И по этому когда сравниваем String с "hello world" то идёт сравнивание уже не объекта String c String, а объекта String с char. Как то так если я не ошибаюсь.
Строка "hello world" также преобразуется в объект String
К ней можно применять все методы объекта String

"hello world".toUpperCase()

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: "И смех и грех": не работает сравнение строк

Сообщение math64 » 30 авг 2012, 10:37

rezak90, нет. Строковая константа - такой же String, только полученный через intern() - поэтому две строковые константы можно сравнивать по ==.

Нужно использовать equals(). Но при этом объект, у которого вызывяют equals() не дложен быть равен null.
Поэтому

Код: Выделить всё

if ("life:)".equals(operatorName)) { ... }

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: "И смех и грех": не работает сравнение строк

Сообщение KamiSempai » 30 авг 2012, 10:50

no-- писал(а):Ой, невнимателен был в прочтении =) Подумал что KamiSempai автор. Но пусть будет)
А я то думаю, чего это меня вдруг кто-то учить бросился. Аж передернуло как пост увидел, честное слово :)
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: "И смех и грех": не работает сравнение строк

Сообщение AndreyI » 30 авг 2012, 13:16

math64 писал(а):rezak90, нет. Строковая константа - такой же String, только полученный через intern() - поэтому две строковые константы можно сравнивать по ==.
Где-то в букварях по java попадалось, что если две строковые константы одинаковые, то при компиляции им будет определен один адрес в памяти.

Т.е. выражение "abc"=="abc" будет давать true по причине, что мы сравниваем ссылки на один и тот же объект.
Или, к примеру,
private static final String s1 = "abc";
private static final String s2 = "abc";

s1==s2 даст true по той же причине (строковые объекты s1 и s2 будут указывать на один и тот же объект в памяти).

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: "И смех и грех": не работает сравнение строк

Сообщение rezak90 » 30 авг 2012, 13:45

private static final String s1 = "abc";
private static final String s2 = "abc";
В этом случае да так как идёт "константа", но кажется так как String объект то он добавляет что то своё и простое сравнение .getString() == "vasia" не прокатит, и для этого есть соответствующие методы в классе String.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: "И смех и грех": не работает сравнение строк

Сообщение Mikhail_dev » 30 авг 2012, 13:56

А я вот краем мозга вспоминаю что строка, это всегда константа и что не только для final String она ссылается на одну область памяти при идентичной строке. И в принципе это очень даже логично.
А если кто-то хочет сделать именно отдельную область памяти, то надо писать new String.
Поправьте меня, если это не так. Нету под рукой инструмента проверить.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: "И смех и грех": не работает сравнение строк

Сообщение math64 » 30 авг 2012, 14:01

Согласно документации, должно быть так (хотя не проверял):

Код: Выделить всё

char[] charVasya = { 'В', 'а', 'с', 'я' };
String strVasya = new String (charVasya);
boolean b1 = strVasya == "Вася"; // false, разные объекты
String strVasya2 = strVasya.intern();
boolean b2 = strVasya2 == "Вася"; // true, один и тот же объект, для строковой константы intern() вызывается автоматом.
String strVasya3 = "Вася".substr(0, 4);
boolean b3 = strVasya3 == "Вася"; // false, разные объекты, хотя буфер один и тот же
final String означает, что указатель на строку не может измениться (но его можно проинициализировать разными значениями в конструкторе).
static final String означает, что этот указатель ещё и общий для всех экземпляров класса. Если он проинициализирован строковой константой, компилятор везде его заменит на эту константу.
Если static нет, такой замены не будет.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: "И смех и грех": не работает сравнение строк

Сообщение neoksi » 30 авг 2012, 14:39

Сам до сих пор попадаюсь с этими String в Java при сравнениях, особенно при проверке строки на пустоту.

ZipovUA
Сообщения: 15
Зарегистрирован: 07 май 2012, 11:17

Re: "И смех и грех": не работает сравнение строк

Сообщение ZipovUA » 02 сен 2012, 15:32

хм... никогда бы не подумал, что банальное сравнение не сработает... спасибо за подсказку.

Ответить