タグ別アーカイブ: Java

Javaで文字列に漢字が含まれているか判定する

自作Androidアプリで「文字列内に漢字があるかどうか」を判定する必要があった。
意外な正規表現で漢字の判定ができることを知ったので備忘録として残す。

続きを読む Javaで文字列に漢字が含まれているか判定する

新しいMacBookでjavaの開発環境を整えた時のメモ

MacbookAirを買った時の記録。
Android開発でJavaのバージョンを調べる必要があった。
続きを読む 新しいMacBookでjavaの開発環境を整えた時のメモ

プログラムのコメントアウトにはFIXME、TODOの他にXXXがある

プログラミング言語のコメントアウトに”XXX”というコメントがあるということをご存知でしょうか

続きを読む プログラムのコメントアウトにはFIXME、TODOの他にXXXがある

docker attachしてctrl+cを押すとコンテナごと削除される罠

こんにちは、11月6日付けで社会復帰を果たしました。
さすがに3ヶ月も家なき子状態を続けていると、社会復帰した時に辛いんだなってことに気づきました。
そして恥ずかしながらこの年齢にして、やっとdockerを業務で触る機会が訪れまして、四苦八苦しつつハマった罠を紹介したいと思います。

続きを読む docker attachしてctrl+cを押すとコンテナごと削除される罠

TwitMorseのつぶやき詳細画面のレイアウトを調整しただけ

Androidアプリ「TwitMorse」version1.6.1をリリースしました。

こんにちは。絶賛就職活動中の元社畜です。

先日とあるWeb系の会社の最終選考で、Twitterアカウントばれして、

「Twitter名、『ハイパーポエムクリエイター』さん、なんですね、何か唄ってみてください」

と言われ、

突然のことで頭が真っ白になってしまってシドロモドロになったので、もう就職活動が嫌になってきています。

続きを読む Androidアプリ「TwitMorse」version1.6.1をリリースしました。

プログラミング初心者におすすめしたいプログラミング関連の情報

最近、技術関連の記事書いてないな、って先程思いまして、ネタはないのですが、個人的にプログラミングを始めるにあたってすごくタメになった書籍とかWebサイトとか紹介しようと思いました。

Webサービスと書籍に分けて紹介してみます。
続きを読む プログラミング初心者におすすめしたいプログラミング関連の情報

自分の開発したAndroidアプリにApp Indexingを導入してみた話

最近”App Indexing(アップインデックシング)”というのが流行っているらしく、仕事でもAppIndexing案件に携わるようになった。
しかし、実のところ、自分でもAppIndexingがなんなのかよく分かっていない。
この度プライベートで開発しているAndroidアプリ「TwitMorse」に導入してその効果を検証してみることにする。

続きを読む 自分の開発したAndroidアプリにApp Indexingを導入してみた話

Android ArrayAdapterからstartActivityする方法

AndroidのListViewでは独自のAdapterを作ってListViewにセットすることができます。
今回、独自のAdapterを作ってその中からあるアイコンをタップした時に別画面へ遷移させる方法がわからなかったので調べてみました。

続きを読む Android ArrayAdapterからstartActivityする方法

?と思ったJavaでInt型をString変換する方法

あるコードを見ていたら下記のような記法を見かけたことがあったので「??」と思い、調べてみたのでメモします。

if(s.equal(""+i)) {

続きを読む ?と思ったJavaでInt型をString変換する方法

Java .equalsメソッドの罠

Javaの.equalsメソッドの罠にひっかかって2週間くらいなやんだのでメモります。
開発してるTwitMorseの逆変換機能の実装の時に直面しました。

equalsメソッドは時折同じ文字列の比較をしてもfalseを返すことがあります。

私が引っかかったコード

protected String convertMorseToText(String text) { 
     String[] morse = text.split(" ", 0);
     for (String moji : morse) { 
     if (moji.equals("--・--")) { 
         convertText += moji.replaceAll("--・--", "ア"); 
     } 
     return convertText; 
}

何をしたかったかというと、
textで入ってきたモールス信号を全角空白で分割し、”ーー・ーー”という文字列があった場合に「ア」に変換して返す
というものでした。

if (moji.equals("--・--")) {

しかし、この一文はfalseとなりスルーされてしまいます。何度”ーー・ーー”を入力しても一致しないものとして処理されていました。
これに2、3週間悩みました。

デバッガで調べていたところどこでfalseになっていたかというと、
Stringクラスのequalsメソッドのある部分でfalseが返されていました。

    @Override public boolean equals(Object other) {
        if (other == this) {
          return true;
        }
        if (other instanceof String) {
            String s = (String)other;
            int count = this.count;
            if (s.count != count) {
                return false;
            }
            // TODO: we want to avoid many boundchecks in the loop below
            // for long Strings until we have array equality intrinsic.
            // Bad benchmarks just push .equals without first getting a
            // hashCode hit (unlike real world use in a Hashtable). Filter
            // out these long strings here. When we get the array equality
            // intrinsic then remove this use of hashCode.
            if (hashCode() != s.hashCode()) {// ここにひっかかる
                return false;
            }

どうもhashCodeの違いでequalsを使っても一致しなかったらしい。

そこで以下のように書き換えてみたところうまく機能した。

protected String convertMorseToText(String text) { 
     String[] morse = text.split(" ", 0);
     for (String moji : morse) { 
     String enc = new String(moji);
     if (enc.equals("--・--")) { 
         convertText += enc.replaceAll("--・--", "ア"); 
     } 
     return convertText; 
}

入力されたtextを全角空白で分割する所までは一緒。
違いは、新しくencという文字列をmojiを使って生成して比較するという部分でした。
これでhashCodeの違いを解消できました。

equalsメソッドをオーバーライドしたりhashCodeメソッドをオーバーライドしたりという解決方法もあるにはあったのですが、自分はこの方法でequalsメソッドの罠を回避しました。

後学のためにメモとして残しておきます。