• ベストアンサー

javaの比較一致(equals)について

javaの基礎的なことについて質問させていただきます。 まず byte配列を空にして、 new String(byteStream.toByteArray(), "UTF-8"); でString変数に代入した後に split関数で分割します。 分割した後に equals関数を使って比較をしてみたのですが TRUEにならず compareTo関数を使用してみたところかなり数値がずれていました。 文字コードで取得した場合はズレが生じるのでしょうか? できればご教授おねがいします。

  • Java
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.4

 こんにちは。  UTF-8ということで、バイトオーダーマークが怪しいと思うのですが、とにかくstrs3[0]の中身をはっきりさせないことには原因究明は難しいと思います。 for (int i = 0; i < strs3[0].length(); i++) {   System.out.print(Integer.toHexString((int)strs3[0].charAt(i)) + " "); } System.out.println();  一文字目が feff ならバイトオーダーマークです。取り除いてください。

tamasandayo
質問者

お礼

秀丸エディタでエンディアンを取り除いたところ動きました! プログラムでちゃんと判別できるようにスキルをつけたいです・・・

tamasandayo
質問者

補足

 一文字目が feff ならバイトオーダーマークです。取り除いてください。 一文字目が feff 入ってました・・・w ほんとに申し訳ないです・・・ これはどうすればとりのぞけるのでしょうか・・・?

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「一応中には同じ文字列が入っている」というのをどうやって確認したのかわからんけど, #2 同様「(その確認した方法ではわからない/わかりにくい) ゴミが入っている」ということは考えられる. ところで, 最後の方の String[] textstr =strs3[i].split("|"); は単なる書き間違いですよね?

tamasandayo
質問者

補足

String[] textstr =strs3[i].split("|"); は今後文字の分割で書いたやつなので気にしないで大丈夫です・・・ 一応Eclipseのデバッグで変数の中身を確認したのですがなぜか・・・文字が一字一句間違っていないのにfalseがかえってきます・・・ Eclipseでデバッグ機能でちゃんと調べられる方法はありますでしょうか・・・?

noname#177743
noname#177743
回答No.2

テキストに半角スペースなどゴミが混じってるという可能性はありませんか? 取得したテキストをtrim()して比較しても同様ですか? あるいは、大文字小文字が一部あっていないとか……。

tamasandayo
質問者

補足

trim()して比較しても同様でした・・・ 文字の一字一句まちがっていないです・・・ 文字コードで分割するとだめなのでしょうか・・・? テキストロードは以下のようにやってます。 //テキストのロード public String loadTextFile(InputStream inputStream) throws IOException { ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); byte[] bytes = new byte[4096]; int len = 0; while ((len = inputStream.read(bytes)) > 0) byteStream.write(bytes, 0, len); return new String(byteStream.toByteArray(), "UTF-8"); }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「分割した後に equals関数を使って比較をしてみた」ってのは, 何と何を比較したんですか?

tamasandayo
質問者

補足

for(i=0; i<strs2.length;){ String[] strs3 = strs2[i].split(","); if(strs3[0].compareTo("NAME")==0){ nameflag=Integer.parseInt(strs3[1]); i++; //break; } if(strs3[0].equals("BACKGRAWND")){ fadeflag = Integer.parseInt(strs3[1]); //バックナンバーによって出力 backgroundnumber =Integer.parseInt(strs3[2]); //フェード終了後出力 i++; //break; } if(strs3[0].equals("TEXT")){ String[] textstr =strs3[i].split("|"); //テクスチャに文字列を代入する。 textImage = new Texture(glGame,textstr , 0, 0, 30); //描画範囲を指定してやる。 textRegion = new TextureRegion(textImage,60, 360, textImage.width, textImage.height); i++; //break; } } ソースの一部です 一応中には同じ文字列が入っているのですがfalseで帰ってきます・・・

関連するQ&A

  • Javaでの文字化けの検出

    Javaでの文字化けの検出 byte配列をStringのコンストラクタの引数に指定してStringに変換した場合に 指定した文字コードで変換できなかった時、System.out.printlnでは"?"で表示されますが、 そのような状態を検出したいのですが、方法がわかりません。教えてください。 "?".equals(対象文字)をしてみてもイコールにならないようです... 文字コードはMS932 UTF-8 Unicodeでの使用になります。OSは日本語WindowsXPです。

  • java equalsメソッドについて

    こんにちは。 java初心者ですがandroidを触ることになりました。 不可解なコードで大変恐縮ですが、ご教授願えれば幸いです。 スピナーでセレクトされた文字列と変数(A,B,C,D)の値を比較して条件分岐させたいのですが、 うまくいかず悩んでいます。 下記コード ■■■の部分になります。 1) スピナーに表示される文字列を取得し、変数itemqに代入。 2) 変数A(SONY)と変数itemq(?)を比較し、同じ文字列か比較する。 3) 同一の値であればitemqの値をテキストビューに値をセットする。 というようなものです。 equalsメソッドで比較しているのですが、この部分がどうやら間違っているようなのですが、 原因が全く分かりません。 無知な質問になりますが、どうぞ皆様宜しくお願いいたします。 またコードについての指摘や助言もおねがいします。 public class SampleActivity extends Activity { String path = "/sdcard/PriceSearch/topitems.csv"; static List<String> items = new ArrayList<String>(); static ArrayAdapter<String> adapter; private ListView listview; public String itemq; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Spinner spinner = (Spinner)findViewById(R.id.spinner1); // read csv file readCsvFile(spinner); spinner.setOnItemSelectedListener(new OnItemSelectedListener(){ public void onItemSelected(AdapterView<?> parent, View viw, int arg2, long arg3) { Spinner spinner = (Spinner)parent; String item = (String)spinner.getSelectedItem(); //トースト表示 Toast.makeText(Price_SearchActivity.this, item, Toast.LENGTH_LONG).show(); itemq = item; listread(); } //Spinnerのドロップダウンアイテムが選択されなかった時 public void onNothingSelected(AdapterView<?> parent) { }}); Button button1 = (Button)findViewById(R.id.btnend); button1.setOnClickListener(new View.OnClickListener() { //@Override public void onClick(View v) { //Activity終了 finish(); return; } }); } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ String A = "SONY"; String B = "TOSHIBA"; String C = "MITSUBISHI"; String D = "FUJITSU"; private void listread() { TextView tv = (TextView)findViewById(R.id.textView2); if (A.equals(itemq) ) { tv.setText(itemq); }else if (B.equals(itemq) ) { tv.setText("itemq"); }else if (C.equals(itemq) ){ tv.setText("itemq"); }else if (D.equals(itemq) ){ tv.setText("itemq"); }else { tv.setText("該当なし"); } } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ private void readCsvFile(Spinner spinner) { try { // create reader InputStream input = new FileInputStream(path); InputStreamReader ireader=new InputStreamReader(input, "UTF-8"); CSVReader reader = new CSVReader(ireader,',','"',0); String[] csv; //スピナー用 ArrayAdapterを作成 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner); while ((csv = reader.readNext()) != null) { //ドロップダウンアイテムの追加 adapter.add(csv[0]); } //スピナーにadapterを設定 spinner.setAdapter(adapter); reader.close(); ireader.close(); input.close(); } catch (FileNotFoundException e) { Log.e("ERROR", e.toString()); } catch (UnsupportedEncodingException e) { Log.e("ERROR", e.toString()); } catch (IOException e) { Log.e("ERROR", e.toString()); } } }

    • ベストアンサー
    • Java
  • javaは、SJISとUTF-8のどちらがデフォルトなのでしょうか?

    javaは、SJISとUTF-8のどちらがデフォルトなのでしょうか? 現在PCにインストールしているJavaのバージョンは、Version 6 Update 21です。 eclips上のコンソールで実行すると、入力がUTF-8の為、equals()での比較が出来ません。 //---以下サンプルソース-- System.out.println("入力"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String strTmp = br.readLine(); //入力 StringBuffer sb = new StringBuffer(); //入力で、”終了”を入力しても、strTmp.equals("終了")が、TRUEになりません。 while(!strTmp.equals("終了")){ sb.append(strTmp); strTmp = br.readLine(); //入力 } //---ここまで--- DOS窓上で、「javac -encoding utf8 sample.java」とやって、テストすると入力もSJISな為、”終了”で終了します。 これは、eclipsの問題ですか? javaのインストール時の設定の問題ですか? 初歩的な質問で、恐縮ですが、どうかご教授下さい。m(_。_)m

    • ベストアンサー
    • Java
  • JavaでMACアドレスを取得して加工したい!

    JavaでMACアドレスを取得して加工したい! 見出しの通りなのですが JavaでMACアドレスを取得して それをString型の配列に代入して色々加工したいのですが なかなか上手くいきません。 取得して代入からうまくいってません・・・ 初心者なのでわかりやすく教えていただけるとありがたいです。

    • ベストアンサー
    • Java
  • javaのプログラムについて

    javaのプログラムで char型の配列に格納した文字を String型の変数に格納できる関数を教えてください 具体的な使い方も教えていただけるとうれしいです

    • ベストアンサー
    • Java
  • javaプログラムについて

    mainメソッド内の指定された部分の処理を、 別のメソッドに分けてください。 mainメソッド内から作成した別メソッドを呼び出して 実行できるようにしてください。 ※分ける前と分けた後で処理結果が変わらないこと (入力された文字が"A"の場合true, それ以外の場合falseを返すように) */ class MethodAdd1{ public static void main(String[] args){ /* // ★ここから if("A".equals(args[0])){ judge = true; }else{ judge = false; } // ★ここまで */ boolean judge; if("A".equals(args[0])){ System.out.println("true"); }else{ System.out.println("false"); } } /* **戻り値:boolean **引数:String */ //ここにメソッドを作成 public static boolean equals(String a){ String str="A"; if("A".equals(str)){ return true; }else{ return false; } } } これで一応trueかfalseと表示されるのですが、合っているのか分かりません。 お時間のある方で、手直しをして頂ける方お願い致します。

  • Cの構造体のデータのbyte配列をjavaのclassに入れるには

    サーバーからCの構造体のデータをbyte配列で受け取ったものをjavaのclassに入れるにはどうすればよいでしょうか? クライアントプログラムがCなら受け取ったデータをそのまま構造体にコピーすれば終わりなのですが(サーバーもクライアントもx86なのでendianを気にする必要が無い)、java で簡単に書く方法が分からないので、今はbyte配列から1バイトづつ読みだして、classのメンバーに代入しています。もっとスマートな書き方はないでしょうか?

  • iアプリのjavaでsplitは使えないのですか?

    iアプリの開発をしています。 サーバーから取得した文字列を split を使って String の配列にしようと思ったのですが、 JDK1.5 compile... C:\iDKDoJa5.0\apps\msho\src\mshoCanvas.java:336: シンボルを解決できません。 シンボル: メソッド split (java.lang.String) 場所 : java.lang.String の クラス msg = error_msg.split("\n"); エラー 1 個 javacの実行に失敗しました となってコンパイルエラーになります。どうも、splitが存在しないようなのですがそいう仕様なのでしょうか? 代わりのメソッドはindexOf()とsubstring()を使って簡単に作れそうではありますが、用意されているのならわざわざ作るのはバカバカしいので(作るのがバカバカしいのではなく、サイズが増えるのが)質問しました。

    • ベストアンサー
    • Java
  • JavaのString配列で隣り合うデータを順に比較する

    JavaのString配列で隣り合うデータを順に比較する Javaのバージョンは1.5です。 配列の隣り合うデータを順に比較し、異なるデータがあったら フラグのカウントを+1したいです。(下記の配列の場合のカウントは3になります) 特に並べ替えは行いません。 String[7] color = {"aka","aka","aka","ao","ao","aka","kuro"} 配列のデータ数は固定なので、 for文などのループ処理で比較を繰り替えすものだとは思うのですが、 うまくカウントできません。 一つ目の不一致(3つ目と4つ目の比較)が見つかった後、 次の比較へ移るところ(4つ目と5つ目の比較)がうまくいきません どのように記述すればよいでしょうか?

    • ベストアンサー
    • Java
  • [VB.net] StringからByte配列への変換

    皆さんこんばんは。 最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。 VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。 CByte( Mid(str,i,1) ) CLng( Mid(str,i,1) ) 他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。 ("『"を上下反転したような文字) ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。 よろしくお願いします。

専門家に質問してみよう