Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

キーボードからの入力について

はじめまして、私はjava初心者です。
まず問題を提示して、キーボードで答えを入力して、その回答が合っているかどうか○×で表示させるものを作りたいのですが、下のソースを実行させて正解であるFeと(大文字小文字も正確に)入力してもif文ではなくelse文が画面に表示されます。
色々調べたりしていじって実行してみるのですが、同様の結果しか得られません。
どこか間違っているでしょうか?
簡単な間違いだったらごめんなさい。
どなたかわかる方がいらっしゃればご指導お願いします。
あと簡単なもので良いので、改変した具体的なソースを提示してもらえるととても助かります。

//------------------------------------------------

import java.io.*;

class Element
{
  public static void main(String args[]) throws IOException
  {
    System.out.println("鉄の元素記号は?");
        
    BufferedReader br =
     new BufferedReader(new InputStreamReader(System.in));

    String str = br.readLine();

    String ans = "Fe";

    if(str == ans){
      System.out.println("○");
    }
    else{
      System.out.println("×\t答え:" + ans);
    }
  }
}

//------------------------------------------------

わかると思いますが、鉄の元素記号はFeです。
よろしくお願いします。
         

15

回答

3648

閲覧

15件の回答

評価

0

Stringはintなどと異なり、クラスです。
クラスの同一性を比較する場合、どうすれば良いでしょうか。

http://www.javaroad.jp/java_character3.htm

評価

0

「同一性を比較」って変ですね…。「の同一性」は余計です。

評価

0

if(str == ans){



str.compareTo(ans) == 0



str.equals(ans)

あ、でも、readLine() で読んだら、改行コードは
どーなんの?
知らんけど。

評価

0

if(str == ans){

if(str.equals(ans) == true){

のように変更すると、望み通りの結果が得られました。
mioさん、あさん、ありがとうございます。

しかし、どうして
if(str == ans){
だとできなかったのかがわかりません。
==だとString型のstrとansが等しい文字列であると判別することができないのでしょうか?

評価

0

http://www.atmarkit.co.jp/fjava/onepoint/java/jv14.html

このあたりが参考になるでしょうか?
プリミティブ型とオブジェクト型の違いですね。
文字列の比較は初心者が間違えやすい項目の一つですので、
いろいろ調べてしっかりと考え方をマスターしておきましょう。

評価

0

Stringは、"Fe"そのものではなく、それ(+いろいろ)を内部に持った箱のことです。
==演算子は外側しか比較しないので、内部にある"Fe"が同じでも、格納している箱が違うとfalseになってしまうのです。
対してequalsメソッドでは、内部にある"Fe"を取り出して比較します。
少し分かるようになったら、Stringクラスのソースコードを見てみるのも良いでしょう。

評価

0

> if(str.equals(ans) == true){

boolean == boolean はやるだけ無駄。

if (str.equals(ans)) {

としましょう。

unless 方式ならば

if (!(str.equals(ans))) {

評価

0

>mioさん
>「同一性を比較」って変ですね…。「の同一性」は余計です。

文言に突っ込んでしまって、申し訳ないですが、
「の同一性」が余計なのではなく、
「オブジェクトの同一性(等価性)を比較」または
「あるクラスのインスタンスの同一性(等価性)を比較」ではないでしょうか。

「クラスの同一性を比較する」では、Class同士を比較しなければならないので。

評価

0

三等兵さん、mioさん、解説ありがとうございます。
完全とまではいきませんが、文字列の比較は==演算子ではなくてequalsメソッドを使うという風に理解しました。
もう少し勉強したらもっと突っ込んだ理解をしようと思います。

ALICEさん、ご指摘ありがとうございます。
おっしゃるとおりですね。
ついついifの条件には==演算子を使わなければならないのかと思っていました。

みなさんありがとうございました。
まだまだわからないことだらけです、また機会がありましたらご指導お願いします。

評価

0

==を使わないというわけでは、ないのですけどね。
前回の例でもまだ判然としないですか…文字で表現するのは難しいですね。
たとえば、

Element社main部にある
str課(所属:fさんとeさん)
ans課(所属:fさんとeさん)

の所属員が同じ(equals)かどうかというのではどうでしょうか。
逆に分かりづらかったらすみませんが。

評価

0

>> if(str.equals(ans) == true){
>
>boolean == boolean はやるだけ無駄。

これは?

別に無駄ではないが?視覚的に何やっているのか
分かるし。
君が無駄って言いたい部分は分かるが。論理式を
取るからって書けばいいのに。。。
str.equals() の戻り値は boolean だから、
== boolean は冗長です。

でも、無駄無駄、言っても、どれくらい無駄なのか
調べたわけじゃないのでしょ?
1000万回比較してやっと1秒未満の差が出てくる
くらいだよ。


評価

0

==trueは、コンパイラが最適化で削ると思いますよ。
コンパイル時間は微妙に変わるけれど、実行時には差異なし。

評価

0

コンパイル時間がどれだけ違うか試してみようとしたところ、

Test1.java:1: コードが大きすぎます。

なるエラーが・・・

ちなみに生成のためのコードはこれ

import java.io.*;

public class Hoge {
    public static void main(String[] args) throws IOException {
        BufferedWriter out = new BufferedWriter(
            new FileWriter("Test1.java"));
            out.write("public class Test1 {public static void main(String[] args) {");
        out.newLine();
        out.write("boolean b = Boolean.valueOf(args[0]);");
        out.newLine();
        for (int i = 0; i < 100000; i++) {
            out.write("if (b == true) System.out.println();");
            out.newLine();
            out.flush();
        }
        out.write("}}");
        out.close();
    }
}

ま、ファイルのIOの時間に比べると==trueの最適化の時間なんて誤差の範囲になっちゃうと思うけどね。

評価

0

私も初めて知りましたが、1つのメソッドには、64kBの制限があるようですね。
なんだかセグメントがらみのような気もしますが、低位の環境でも動作可能なようにという制限のように思います。

評価

0

というわけで、一応これなら通りますね。

import java.io.*;

public class Hoge {
    public static void main(String[] args) throws IOException {
        BufferedWriter out = new BufferedWriter(
            new FileWriter("Test1.java"));
        out.write("public class Test1 {");
        for (int i = 0; i < 100; i++) {
            out.write("public static void main"+i+"(String[] args) {");
            out.newLine();
            out.write("boolean b = Boolean.valueOf(args[0]);");
            out.newLine();
            for (int j = 0; j < 1000; j++) {
                out.write("if (b == true) System.out.println();");
                out.newLine();
            }
            out.write("}");
            out.newLine();
            out.flush();
        }
        out.write("}");
        out.close();
    }
}

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。