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

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

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

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

Q&A

解決済

1回答

948閲覧

equals()をオーバーライドしているのにremove()できない。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

1グッド

1クリップ

投稿2018/07/26 00:36

eclipseでスッキリわかるJava入門実践編を勉強しています。
以下のlist04-04.javaコードは正常動作しないコードなのですが、HeroクラスでhashCode()を
オーバーライドするとうまくいくと書いてあります。
Hero.javaがあるんですが、これとlist04-04.javaをどのように組み合わせると
実行結果
要素数=1
要素数=0
となるでしょうか。
List04_04a.javaとして実行すると上のような結果になるんですが、このコードは
どこか間違いがありますか。おしえてください。

List04_04a.java package sample2; import java.util.HashSet; import java.util.Set; class Hero { public String name; public boolean equals(Object o) { /* equals()をオーバーライドしている */ return true; } int hp; public int hashCode() { int result = 37; /* (1) 適当な初期値を決める */ result = result * 31 + name.hashCode(); /* (2) 各フィールドの影響を加える */ result = result * 31 + hp; return result; /* (3) 結果を返す */ } } public class List04_04 { public static void main(String[] args) { Set<Hero> list = new HashSet<Hero>(); /* HashSetを利用 */ Hero h1 = new Hero(); h1.name = "ミナト"; list.add(h1); /* インスタンスを作って格納 */ System.out.println("要素数=" + list.size()); h1 = new Hero(); h1.name = "ミナト"; list.remove(h1); /* 名前が「ミナト」の勇者を削除 */ System.out.println("要素数=" + list.size()); } }
Hero.java class Hero { String name;   int hp; public int hashCode() { int result = 37; /* (1) 適当な初期値を決める */ result = result * 31 + name.hashCode(); /* (2) 各フィールドの影響を加える */ result = result * 31 + hp; return result; /* (3) 結果を返す */ } }
list04-04.java package sample; // 正常動作しない import java.util.HashSet; import java.util.Set; class Hero { public String name; public boolean equals(Object o) { /* equals()をオーバーライドしている */ return false; } } public class Main { public static void main(String[] args) { Set<Hero> list = new HashSet<Hero>(); /* HashSetを利用 */ Hero h1 = new Hero(); h1.name = "ミナト"; list.add(h1); /* インスタンスを作って格納 */ System.out.println("要素数=" + list.size()); h1 = new Hero(); h1.name = "ミナト"; list.remove(h1); /* 名前が「ミナト」の勇者を削除 */ System.out.println("要素数=" + list.size()); } }
A-pZ👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

「equalsをオーバーライドしていること」が鍵なのではなく、「equalsで等しいと判定できること」が鍵です。
そもそもCollection#remove(Object)は、引数として与えられたオブジェクトと「等しい」オブジェクトを探してコレクションから削除する機能です。この「等しい」判定にequalsメソッドが使われるのです。
trueを返せば等しいと判定しますので、削除されます。ただし、上の実装方法ではHeroクラスのオブジェクトを渡せばなんでも最初に見つかるものを削除してしまいます。
falseを返せば相手が何でも等しくないと判定されてしまうので、削除するオブジェクトがないということになります。

投稿2018/07/26 01:23

swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2018/07/26 01:31

ありがとうございます。 よくわからないので、先に進みます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問