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

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

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

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

Q&A

解決済

1回答

2849閲覧

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

former_neet_cat

総合スコア46

Java

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

0グッド

0クリップ

投稿2018/03/10 17:01

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

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

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

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

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

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

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

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

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

Set cannot be resolved to a type HashSet cannot be resolved to a type

該当のソースコード

java

1public class Employee { 2 3 private int employeeNo; 4 private String employeeName; 5 6 public Employee(int employeeNo, String employeeName) { 7 this.employeeNo = employeeNo; 8 this.employeeName = employeeName; 9 } 10 //getter と setter は省略  とかかれている。 11 12 13 14 15 @Override 16 public boolean equals(Object obj) { 17 if (this == obj) { 18 return true; 19 } 20 if (obj == null) { 21 return false; 22 } 23 24 if (getClass() != obj.getClass()) { 25 return false; 26 } 27 28 Employee other = (Employee)obj; 29 if (this.employeeNo != other.employeeNo) { 30 return false; 31 } 32 if (employeeName == null) { 33 if (this.employeeName != null) { 34 return false; 35 } 36 37 } 38 else if (!employeeName.equals(other.employeeName)) { 39 return false; 40 } 41 42 return true; 43 44 45 } 46 47} 48

java

1 Employee employee1 = new Employee(1 , "Mr.Yamada"); 2 Employee employee2 = new Employee(1 , "Mr.Yamada"); 3 4 Set<Employee> employees = new HashSet<>(); 5 employees.add(employee1); 6 employees.add(employee2); 7 8 System.out.println(employees.size());

試したこと

java

1 2public class Eaction { 3 4 public static void main(String...arge) { 5 6 Employee employee1 = new Employee(1 , "Mr.Yamada"); 7 Employee employee2 = new Employee(1 , "Mr.Yamada"); 8 9 Set<Employee> employees = new HashSet<>(); 10 employees.add(employee1); 11 employees.add(employee2); 12 13 System.out.println(employees.size()); 14 } 15} 16

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

eclipse使用してます。

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

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

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

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

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

y_waiwai

2018/03/10 17:04

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

2018/03/10 17:07

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

2018/03/10 17:20

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

回答1

0

ベストアンサー

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

java

1import java.util.Set; 2import java.util.HashSet; 3 4public class Eaction { 5 ... 6}

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

Set cannot be resolved to a type

HashSet cannot be resolved to a type

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

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

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

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

java

1java.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]というものにしかなりません。
リストで持つ情報は「何の要素が何番目にあるか」ということなのに対し、
集合が持つ情報は「その要素が集合に属しているかどうか」だけであるため、
同じ要素を複数持つ必要がありません。

投稿2018/03/10 17:18

編集2018/03/11 03:13
swordone

総合スコア20651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問