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

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

ただいまの
回答率

89.98%

HashSetがイマイチ理解できないのと参考書のコードをどうしたら実行できるかわからないです。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 624

 HashSetの説明と、どうすればコードが動くのか教えて欲しいです。

参考書で、HashCodeメソッドを学習していた時に、

・最初にハッシュ値でオブジェクトを比較する
・ハッシュ値が等しい場合に限り、equalsメソッドで厳密な判定を行う

という流れでオブジェクトを比較しないと、バグを生む可能性があると書いてあり、バグの例を出すコードが記載されていました。
しかし、それを確認するためにコードを書いて実行しようとしたのですが、うまくいきません。
HashSetの説明もなかったので、調べてみると(なんとなく理解できた点??)

・値の集合を扱うクラスで、同じ値を1つのみ持つことができるもの・・・?

など様々なサイトなどを参考にして調べたのですが・・・私の理解力が著しく無いのか、理解できるようなものはなく、かなり困惑しています。

以下のコードを実行して、2と表示される結果を確認したいのですが、どうすれば実行できますか?

もし宜しければ、HashSetの説明もお願いします。

 発生している問題・エラーメッセージ

Set cannot be resolved to a type

HashSet cannot be resolved to a type

 該当のソースコード

public class Employee {

    private int employeeNo;
    private String employeeName;

    public Employee(int employeeNo, String employeeName) {
        this.employeeNo = employeeNo;
        this.employeeName = employeeName;
    }
    //getter と setter は省略  とかかれている。




    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }

        if (getClass() != obj.getClass()) {
            return false;
        }

    Employee other = (Employee)obj;
    if (this.employeeNo != other.employeeNo) {
        return false;
    }
    if (employeeName == null) {
        if (this.employeeName != null) {
            return false;
        }

    }
    else if (!employeeName.equals(other.employeeName)) {
        return false;
    }

    return true;


    }

}
    Employee employee1 = new Employee(1 , "Mr.Yamada");
    Employee employee2 = new Employee(1 , "Mr.Yamada");

    Set<Employee> employees = new HashSet<>();
    employees.add(employee1);
    employees.add(employee2);

    System.out.println(employees.size());

 試したこと

public class Eaction {

    public static void main(String...arge) {

    Employee employee1 = new Employee(1 , "Mr.Yamada");
    Employee employee2 = new Employee(1 , "Mr.Yamada");

    Set<Employee> employees = new HashSet<>();
    employees.add(employee1);
    employees.add(employee2);

    System.out.println(employees.size());
    }
}

 補足情報(FW/ツールのバージョンなど)

eclipse使用してます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2018/03/11 02:04

    うまくいかないとは、どうなるのでしょうか?

    キャンセル

  • former_neet_cat

    2018/03/11 02:07

    コードを試すと、エラーが出るということなのです。説明が下手ですいません。もし宜しければどのように書けばいいか教えていただけないでしょうか?

    キャンセル

  • y_waiwai

    2018/03/11 02:20

    回答に先を越されてしまたw

    キャンセル

回答 1

checkベストアンサー

+3

SetHashSetjava.utilパッケージのクラスなので、import宣言が必要です。

import java.util.Set;
import java.util.HashSet;

public class Eaction {
    ...
}

 補足1 エラーメッセージについて

Set cannot be resolved to a type

HashSet cannot be resolved to a type

これは直訳すると、「Set(HashSet)は型として解決できない」となります。
型として解決できないとは、型の名前として使えない、ということです。
つまり、コンパイラが"Set"や"HashSet"を型の名前として認識できないということです。

通常クラス内で単純な型名で使えるのは

  • プリミティブ型
  • java.langパッケージ内のクラス(StringやSystemなど)
  • 同一パッケージ内のクラス

であり、これら以外はパッケージ名を含む完全修飾名で記述する必要があります。
今回の例でいえば、

java.util.Set<Employee> employees = new java.util.HashSet<>();


のように本来なら書かなければいけません。しかし、いちいちこんな長ったらしい名前を書いていたのでは面倒ですし、読みにくいですし、間違えやすいです。
このようなクラスを単純なクラス名で書けるようにするのがimport文です。

 補足2 Set,HashSetについて

Setは集合を表すインタフェースです。Listと異なり、同じものを複数持つことができません。また通常は各要素に順序を持たず、インデックスでアクセスできません。
Setに対して、すでにそのSetが持っているものと同じ要素をaddした場合、Setは何も変更されず、falseが返されます(Listではあまり意識されませんが、addメソッドは実行した結果「変更されたかどうか」を表すbooleanが返されます)。
例えばIntegerのListでは[1,1,1,2,3,3,4]のような値の持ち方ができますが、
IntegerのSetにこのList要素を全部addしても、[1,2,3,4]というものにしかなりません。
リストで持つ情報は「何の要素が何番目にあるか」ということなのに対し、
集合が持つ情報は「その要素が集合に属しているかどうか」だけであるため、
同じ要素を複数持つ必要がありません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Javaに関する質問
  • HashSetがイマイチ理解できないのと参考書のコードをどうしたら実行できるかわからないです。