14データ構造セット

みなさん、こんにちは。私はキャベツでアーチ型の豚です。

作者のゴシップ
「本は百回読まれ、その意味は自己満足である」は本当に馬鹿げていません。いくつかの単語や物事は、私たちがそれらを個人的に経験した後にのみ、より深く理解されます。そして、それは通常、「まあ、私は知っている」のように聞こえます。2回目の学習の過程で、知識フレームワークを構築することがいかに重要であるかを深く理解しました。学習プロセス中に、脳の知識システムは、このレッスンで学んだこと、このレッスンをより簡単に思い出すのに役立ちますそれに含まれる知識ポイント。木のように枝を覚えておけば、葉に多くの時間を費やす必要はありません。
前に説明したリストと同様に、リストは2つのブランチArrayListとLinkedListに分かれています。それらの違いは何ですか、1つは配列線形テーブルで、もう1つはチェーン線形テーブルです。異なる名前は見ないでくださいが、共通の方法があります。以下では、一般的に使用される方法を覚えています。これはストレージ機能であるため、追加、削除、変更に基づいています。セット(位置、要素)を追加、削除、削除、削除、変更(置換)する場合、クエリは最初に要素get()を取得する必要があります。最後に、挿入(位置、要素)を追加します。
データ構造ナレッジフレームワークのリストが完成したら、セットを見てみましょう。その後、分割を続けます。

セットする

収集は、その名前が示すように、乱雑で、厳密ではなく、適切なキューでさえも、物事をまとめることです。セットの特徴は、乱れていることです(順序付けされていないわけではありません。実際、内部の要素はハッシュアルゴリズムに従って並べ替えられています。これは、一般の人々がハッシュアルゴリズムを知らないため、人々の無秩序と同じです。) .get()このメソッド。それを見るには、すべての要素を出力する必要があります。このプロセスはトラバーサルと呼ばれます
さらに、セットには2つの息子のハッシュセット(ハッシュセット)とツリーセット(ツリー列セット)があります。
最初に要素を取り出す方法について話しましょうか?
1. イテレーターの近く要素をパックし、 1つずつ出力します。イテレータには、次の要素があるかどうかを確認して出力するhasNextメソッドがあります。

Set<String> set1 = new HashSet<String>();
Iterator<String> iter = set1.iterator();
		while (iter.hasNext()) {
			String element = iter.next();
			System.out.println(element);
		}

set1.iterator();は、setの要素をイテレータに入れます。
2.要素の一意性
セットは、要素のアドレスに基づいてそれが一意であるかどうかを判断しますが、カスタムタイプの場合、現時点では何をすべきかわかりません。オブジェクトは作成されないため、アドレスは異なります。それでもSet独自の判別方法に従っている場合は、明らかに機能しません。

		Student s1 = new Student(1001, "Jerry");
		Student s2 = new Student(1002, "Franklin");
		Student s3 = new Student(1003, "Tom");
		Student s4 = new Student(1001, "Jerry");

学校では、学生番号に従って各学生を区別します。ここで、s1とs4の学生番号はどちらも1001です。明らかに、それらは同じ人物であり、オブジェクトが作成されるたびに、コンピューターは各オブジェクトにメモリスペースを割り当てます異なるアドレス。セットはそれらを異なる要素であると考えていますが、それは明らかに私たちが望むものではありません。
要素の一意性を判断する方法をセットに通知する必要があります。Studentクラスがある場合、カスタムクラスStudentのオブジェクトが繰り返されるかどうかは、Studentに委ねられます。
Setに私たちがユニークであることをどのように伝えることができますか?
hashcodeとequalsメソッド
(1)hashCode()を
最初の予備判断で書き換えます。つまり、各人に番号を付けます。映画鑑賞用の映画のチケットがあり、これは私たちが入場する証明書ですこれで私たちは自分の席を見つけることができます。コレクションでも同じです。最初にあなたの番号を見て、入力されたものと比較してください。番号がない場合は入室できます。それでは、あなたと同じです。このとき、あなたとふたりが同じかどうかよく見て、次の判断方法に進みます。
(2)等しい()
最初にこのメソッドに入る前、hashCodeは同じで、hashCodeは予備的な判断にすぎません。この方法では、名前に基づいて、今日のチケットを購入するかどうかなどの判断方法を記述できます。とにかく、ここで何が違うのかを調べる必要があります。ブール変数を返す、trueを返すは同じ、2つを繰り返す Falseは異なります。

//为了让对象在集合中有一个判定依据,需要给每一个对象一个编号(票)
	public int hashCode() {
		System.out.println("进入集合的时候自动被调用,当前票是:" + code);
		return code;
	}
	
	public boolean equals(Object obj) {
		//因为进入equals方法的object,已经是hashCode一致了
		Student stu = (Student)obj;
		return name.equals(stu.name);
		/*if (name.equals(stu.name)) {
			return true;
		} else {
			return false;	
		}*/
	}

:これら2つのメソッドの内容はカスタマイズされています。好きなように記述できます。つまり、要素が一意であるかどうかを確認する必要があります。

一般的な方法を設定する

(1)サイズ()サイズ、つまり要素の数を決定する
(2)要素を追加する()要素を追加する
(3)削除()要素を削除する
(4)全体であるため、単一の要素を取得できないため、取得できません()
しかし、containsを使用して、この要素があるかどうかを判断できます
(5)それらを取得するには、すべての要素を取得する必要があります。このとき、イテレータを使用して、1つずつトラバースします。

まとめ

研究を終えた後、あなたは要約を持ち、あなたが言ったことについて考えるべきです。何を覚えていますか。
ユニーク:どのくらいユニーク?カスタム型、hashCodeおよびequalsメソッド
Unordered:次に、Listとは異なり、要素を取得するには、前の要素に関連付けられている必要があるため、get()メソッドはありません。
方法:追加、削除、変更から、関連付けを見つけて開始します。
息子:hashSetとtreeSetについては、後で説明します。

元の記事を24件公開 賞賛された4件 2038回の訪問

おすすめ

転載: blog.csdn.net/weixin_44226263/article/details/97790145