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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

3回答

2068閲覧

equalsメソッドについて

touch

総合スコア38

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2015/04/04 01:18

Objectクラスのequalsメソッドをオーバーライドし、mapクラスのequalsメソッドを実装させる課題に取り組んでいます。APIを参照したところ、「引数で指定されたオブジェクトがマップであり、二つのマップエントリが同じマッピングを表す場合は、trueを返す。」と書いてあるのですが、マップであるかどうかの判別や、マップエントリ(キーと値)を比較するプログラムをどのように組めばよいかわかりません。以下のコードはインターネットで見つけ、手を加えたものですが、正直何をしているのかさえわからない上に、講師にApiに定義されているMapクラスのequalsメソッド通りに作成してほしいと言われてしまいました。

どなたかよろしければ、ご教授願えませんでしょうか?
よろしくお願いいたします。


public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) {//マップの比較? return false; } LocalMap map2 = (LocalMap)obj;//代入 if (count != map2.count) {//要素数の比較 return false; } for (int i = 0; i < count; i++) { Object k = keys[i]; if (!get(k).equals(map2.get(k))) {//? return false; } } return true; }

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

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

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

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

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

guest

回答3

0

授業の課題ですよね?授業でわからないことがあれば先生に聞くのが普通だと思うのですが。

投稿2015/04/04 02:23

otn

総合スコア84423

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

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

0

APIのMapというのがjava.util.Mapのことを言っている前提になりますが...
インターネットで見つけたコードより、java.util.Map自体のソースコードを見てみるのが良いんじゃないかと。

そのソースコードを探すのが課題の目的なのかも知れませんので、これ以上は書かないでおきます。

投稿2015/04/04 10:31

argius

総合スコア9388

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

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

0

ちょっと良くわからないのでいくつか質問しますね.
その後,「何をしているのか分からない」というコードについて説明します.

まずmapクラスとは何でしょうか?JavaのインタフェースにMap<K, V>が,また,
それを実装したよく使うクラスHashMap<K, V>がありますが,
状況や手を加えたコードを見るにどうやら違うように思います.
既存のクラスでないのならAPIとは何のことなのか,どうもよくわかりません.
おそらく,既存のクラスに使われているequalsメソッドを自分で考えて書け,という趣旨の課題だと推測しますが・・・

さて,後半のコードについて説明しますが,その前にequalsメソッドとは何か,を考えましょう.
2つのオブジェクトa,bがあるとして,aとbが「等しい」と認識されるとき,
a.equals(b)はtrueを返します.
普通なら,それぞれのオブジェクトが持つ内部の情報がすべて同じであるときに
「等しい」と判定してほしいはずです.
具体的に言えば,a,bそれぞれの変数フィールドを逐一比較する事になります.
ここで問題になるのが,equalsがパラメータとして要求しているのがObjectであるということです.
つまり,渡した引数はすべてObjectにワイドニング変換され,そのままでは元のクラスの変数・メソッドを使うことができません.
また,この例で言えばLocalMapクラス以外のオブジェクトも入りうるので,その際の処理を適切にしないと例外が発生してしまいます.

以上のことを念頭に置いて,コードを見てください.
貴方が疑問に思ったところを説明します.

lang

1 if (getClass() != obj.getClass()) {//マップの比較? 2 return false; 3 }

前述のとおり,objはこの段階でObjectクラスとして扱われるので,実体がわかりません.
そこで,getClass()で,「何のクラスか?」という情報を持つClassオブジェクトを取得し比較します.
これが違えば「違うもの」として判定されるためfalseを返します
(ただしこの書き方は弱点あり.普通はinstanceofを使う)
同じクラス,つまり実体がLocalMapならLocalMapにキャストできるのでキャストし,要素の比較に入ります.

lang

1 for (int i = 0; i < count; i++) { 2 Object k = keys[i]; 3 if (!get(k).equals(map2.get(k))) {//? 4 return false; 5 } 6 } 7 return true;

keysというのが何なのかわかりませんが,マップ作成の際のキーの配列と仮定します.
すべてのキーを使って2つのマップから要素を取得して,逐一比較します.(for節)
この際,1つでも等しくないものが見つかれば,マップとして「等しくない」ということになり,falseを返します.(if節)
forを抜けた場合,すべての要素が等しかった,ということなので,trueを返して終了します.

投稿2015/04/04 09:10

swordone

総合スコア20649

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

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

touch

2015/04/05 12:37

丁寧かつわかりやすい解説をして頂き、大変感謝しております。 おかげさまで疑問点がすっきりし、課題へのモチベーションが上がりました。 これをもとにもう一度自分で考えてみたいと思います。
touch

2015/04/05 13:00

追記になり申し訳ありません。 質問の件ですが、Mapクラスはjava.util インターフェースMapのことを指していました。 つまりObjectクラスのequalsメソッドをオーバーライドし、Mapクラスのequalsメソッドを実装するという趣旨でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問