質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

4回答

632閲覧

if(==)で文字列が一致しているはずなのにtrueが返されない。

hood

総合スコア351

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/02/24 11:49

編集2019/02/24 23:42

###if(==)で文字列が一致しているはずなのにtrueが返されない。
題目通りです。
私は以下のコードのように、もしname_list[chapCount]の文字列が"name""name_body"ならname(findViewByidで取得したテキストビュー)にnullを入れる、それ以外ならname_list[chapCount]の中身を入れるという処理を書きました。

Log.i("text", Integer.toString(chapCount)) Log.i("tex", name_list[chapCount]) if (name_list[chapCount] =="name" || name_list[chapCount]=="name_body"){ name?.text = null }else{ name!!.text = name_list[chapCount] Log.i("text", "name_bodyない") }

しかし、以下のログ出力の画像を見てわかると思うのですが、name_list[1]のときはきちんとTrueが返され、"name_bodyない"は出力されていないのですが、name_list[0]のときは中身がname_bodyであるにもかかわらず"name_bodyない"が出力されています(=if文でtrueが返されていない)
イメージ説明

これはもはや謎としかいいようがありません。どれだけ頭をひねっても解決には至りませんでした。

しまいには家族と友達の次に疑ってはいけないコンピューターを疑うしまつです・・・(実際にandroid studioの再起動をした)(しかし改善はされず)

どうか、この怪奇現象の謎に挑んでくれるかたがいらっしゃったら、ご助力お願いします・・・!

追記---
デバッガでifにブレークポイント張ってname_listの中身を見た結果がこちらです・・・
やはり0にも1にも同じname_bodyが入っているみたいです・・・
イメージ説明

追記2---
2,3,4以降も試しましたが残念なことに?挙動通りでした・・・
もう消去法で、私がここに記していない他のコードが原因となっているとしか思えませんね・・・
イメージ説明

追記3---
ある回答者様のご助言から、いったん文字列をnameTextという変数に入れ、println(nameText.toCharArray().joinToString { "'$it'" })を試してみたら驚くべきことが判明しました。
それは文字が
System.out: '', 'n', 'a', 'm', 'e', '', 'b', 'o', 'd', 'y'
と最初に空の文字列が入っていたということです。(他の文字列は'n', 'a', 'm', 'e', '
', 'b', 'o', 'd', 'y'だった)
イメージ説明
これが==が認識しない原因でした。一応報告として・・・

追記4---
どうやら、BOMというものが付いているテキストファイルだったのが原因だったようです。
windowsのメモ帳ではなく、sublimetextを使ってUTF-8で保存したら実行通りできました。

本当にみなさんありがとうございました!!!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/02/24 12:00

前提知識が無い状態で、いくら頭をひねっても解決しません。 調べましょう。 > しまいには家族と友達の次に疑ってはいけないコンピューターを疑うしまつです 一番に疑うべきは自分自身ですよ。これは初心者も、上級者も同じ。
hood

2019/02/24 12:28

回答ありがとうございます。 一言もありません。地力と経験が圧倒的に足りないと、改めて気づかされました。自分を疑うこと、これを忘れずに、歩いてゆきたいと思います!!!
ozwk

2019/02/24 13:01

デバッガでifにブレークポイント張ってname_listの中身見てください
hood

2019/02/24 13:20

name_listの中身を見ました! 結果の画像も追記したいと思いますが、やはりname_bodyが入っているようです・・・夜とともに謎は深まるばかりです・・・
kakajika

2019/02/24 15:06 編集

とりあえず、同じ値に何度もアクセスするならいったん変数に入れましょう。 val nameText = name_list[chapCount] 今のコードだと、name_llistやchapCountが別スレッドから書き換えられた時などに想定外の挙動をするはずです。 あと、問題の文字列を1文字ずつprintしてみるのも解決の糸口になるかもしれません。 println(nameText.toCharArray().joinToString { "'$it'" })
hood

2019/02/24 22:28 編集

kakajikaさん、お久しぶりです、そして回答ありがとうございます・・・!変数に入れること、今回だけではなく今後とも気をつけていきたいと思います。 そしてprintln(nameText.toCharArray().joinToString { "'$it'" })を試してみたら驚くべきことが判明しました。 それは文字が System.out: '', 'n', 'a', 'm', 'e', '_', 'b', 'o', 'd', 'y' と最初に空の文字列が入っていたということです。(他の文字列は'n', 'a', 'm', 'e', '_', 'b', 'o', 'd', 'y'だった) たしかに先頭がもう削除できないテキストファイルから文字を読み込み、'\n'で分割したのち':'で分割しただけなのに、なぜこんなことが起きたのか・・・理由はわかりませんが、まさに解決の糸口となりました! さらに調査を続けていきたいと思います!!本当にありがとうございました!! 結果の画像も一応追記したいと思います!
hood

2019/02/24 23:40

ありがとうございます!!!!!!!!!!!!!!!!!!!!!!! windowsのメモ帳ではなく、sublimetextを使ってUTF-8で保存したら実行通りできました!!
guest

回答4

0

文字列(String)の比較は == では無く equals() をご使用ください.

if (name_list[chapCount].equals("name") || name_list[chapCount].equals("name_body")){

投稿2019/02/24 11:56

編集2019/02/24 17:52
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hood

2019/02/24 12:25

たびたびの回答ありがとうございます・・・ 文字列の比較にequals()を使うこと、これからは気をつけたいと思います。 しかし、今回はequals()を使ってもあいかわらず、先にあげたログ画面がでてきてしまいました・・・ 本当にたよりきりで申し訳ないのですが、.equals()以外にも不具合として考えられることはあるでしょうか・・・?
kakajika

2019/02/24 14:57

Kotlinにおける==はequalsの呼び出しと(ほぼ)同等です。少なくとも一方がnullの場合のみ参照比較になります。
jimbe

2019/02/24 16:21

失礼しました kotlin でした.
guest

0

私なら配列の[2][3][4]…を試してみます。
これらもtrueを返さないようであれば、
「なぜ0番が期待通りにならないのか」から
「なぜ1番だけが期待通りの挙動をしたのか」
といった見方ができます。

投稿2019/02/24 14:28

Kota_Kappa

総合スコア116

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hood

2019/02/24 14:44

回答ありがとうございます! [2][3][4]・・・も試してみましたが、0番以外は期待通りの挙動をしました。 誤作動の原因は、他のかたの回答にもコメントしたのですが、おそらく私がここに記していないコードが原因なのだと思います・・・もう一度、徹底的に自分のコードを調べつくそうと思います。 一応[2][3][4]のほうも画像で、追記ではっておきたいと思います。ご提案感謝しました!!!
guest

0

ベストアンサー

Kotlin公式サイトのTRY ONLINEでも使って、その部分の処理に絞って動作を調べてみたらどうでしょうか。でっち上げTextViewでも作って、下記のようなコードにすればとりあえず動くはず(これはこれで、必ずエラーで落ちる問題がありますが、敢えて放置)。

これでも「name_bodyない」と表示されるのか、表示されないのだとしたらAS上のコードと何が違うのか、いろいろ書き加えたりして動かしながら検証してみたらどうでしょうか。

kotlin

1class TextView { 2 var text: String? = "" 3} 4 5fun main() { 6 val name_list = arrayOf("name", "name_body", "hoge") 7 var name: TextView? = TextView() 8 9 for (chapCount in 0 until name_list.size) { 10 11 println(chapCount.toString()) 12 println(name_list[chapCount]) 13 if (name_list[chapCount] == "name" || name_list[chapCount] == "name_body") { 14 name?.text = null 15 } else { 16 name!!.text = name_list[chapCount] 17 println("name_bodyない") 18 } 19 } 20}

釣られてついequalsで書いちゃったよ・・・

投稿2019/02/24 13:40

編集2019/02/24 14:33
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hood

2019/02/24 14:38

回答ありがとうございます!! TRY ONLINEを利用させていただき、私が実際につかっている型やアクセス修飾子に限りなく近いコードを実行しました。 こちらは私の意図した通りに動きました・・・ ```kotlin class TextView { var text: String? = "" } private val name_list: MutableList<String> = mutableListOf() private val bunsho_list: MutableList<String> = mutableListOf() fun main() { val sentences:List<String> = "name_body:私はバグと戦っていた。\nフード:「もうやだ!!」".split("\n") for (sentence in sentences) { val s: List<String> = sentence.split(":") name_list.add(s[0]) bunsho_list.add(s[1]) } var name: TextView? = TextView() for (chapCount in 0 until name_list.size) { if (name_list[chapCount].equals("name") or name_list[chapCount].equals("name_body")) { name?.text = null println("name_bodyある") } else { name!!.text = name_list[chapCount] println("name_bodyない") } } } ``` ということで、どうやら私がこちらのサイトに記したコードに問題はないらしいことがわかりました。 これは大きな前進で、他のコードを調べることができます。再度ありがとうございました!!!
jimbe

2019/02/24 17:55 編集

もしやですが, この TRY ONLINE で実行されたコードの sentences の元は, テキストファイルではありませんか? 一ヶ月前に, ファイルから読み込んだテキストに関するご質問がございました. https://teratail.com/questions/171059
hood

2019/02/24 22:32

その通りです・・・<string>などを避けるために、 assets.open("yodaka.txt").reader(charset = Charsets.UTF_8).use { it.readText() } というようなコードで、テキストファイルから読み込ませていただきました・・・ それでnameやnamebody以外、を「登場人物がしゃべる」というマークにしたのです・・・
hood

2019/02/24 23:45

追記もしたのですが、どうやらBOMというものつきでファイルを読み込んでいたことが原因だったようです。こんなの一人では決してわかりませんでした。お二方とも、本当にありがとうございました・・・
jimbe

2019/02/25 00:17

またしてもメモ帳にやられました. 無念です.
keicha_hrs

2019/02/25 01:24 編集

BOM付きUTF-8って、なかなかそこまで想像はできないなあ・・・。メモ帳は次期アップデートでBOM無しUTF-8が標準になるようですが、それでもプログラミングに関わるものを作成するのにメモ帳は使わない方がいいでしょうね。それよりましな無償テキストエディターはいくらでもありますし。
hood

2019/02/25 05:21 編集

そうですね・・・とりあえずエディター戦争の少数派、sublime教会に入ろうと思います・・・いろいろとご迷惑をおかけしました・・・
guest

0

スペースとか入ってません?

投稿2019/02/24 12:37

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hood

2019/02/24 12:47

回答ありがとうございます。 それについてはもう、何回も確認しまして、1の文字を0にコピペしたりしたのですけれどもだめでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問