java基础--集合フレームのセット

7835 ワード

一、HashSetとTreeSetの比較
Set:元素は無秩序(預け入れと取り出しの順序が必ずしも一致しない)であり、要素は重複してはいけない.
Setセットの機能はCollectionと一致している.
1、hashSetとTreeSetの比較
ハイセット
下のデータ構造はハッシュテーブルであり、スレッドが安全ではなく、同期ではない.
 
TreeSet
_;--TreeSet:Setセットの要素を並べ替えることができます.一番下のデータ構造は二叉ツリーです.
また、中に入れる対象は比較性を備えて並べ替え、最後に預け入れます.
 二、hashSet集合
1、HashSetは元素の一意性をどのように保証しますか?
   要素の二つの方法で、hashCodeとequalsによって完成されます.
   要素のHashCodeの値が同じであれば、equalsがtrueであるかどうかを判断します.要素のhashcodeの値が違っていれば、equalsは起動されません.
   私たちは一般的にオブジェクトを格納する時、この2つの方法を複写します.既存のhashCodeとequals方法は住所または住所によって計算された値によって比較されます.
 (hashCodeの内部呼び出しもequals方法です)意味がないので、hashCodeとequals方法を複写して、元素自身の条件の特徴によって元素の一意性を判断します.
 
注意:要素の有無や削除などの操作に対して、依存する方法は元素のhashcodeとequals方法です.
 
HashSetセットを使用して、カスタムオブジェクトの例コードを保存します.
 
要求:名前と年齢が同じであれば、同一の人物と見なし、元素を繰り返します.
説明:主にhashCodeとequals方法の使用です.
import java.util.HashSet;
import java.util.Iterator;

class HashSetTest {
	public static void sop(Object obj) {
		System.out.println(obj);
	}

	public static void main(String[] args) {
		HashSet hs = new HashSet();

		hs.add(new Person2("a1", 11));
		hs.add(new Person2("a2", 12));
		hs.add(new Person2("a3", 13));
		// hs.add(new Person2("a2",12));
		// hs.add(new Person2("a4",14));

		// sop("a1:"+hs.contains(new Person("a2",12)));

		// hs.remove(new Person("a4",13));

		Iterator it = hs.iterator();

		while (it.hasNext()) {
			Person2 p = (Person2) it.next();
			sop(p.getName() + "::" + p.getAge());
		}
	}
}

class Person2 {
	private String name;
	private int age;

	Person2(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public int hashCode() {
		
		System.out.println(this.name + "....hashCode");//      hashCode  
		return name.hashCode() + age * 37;
	}

	public boolean equals(Object obj) {

		if (!(obj instanceof Person))
			return false;

		Person2 p = (Person2) obj;
		
		System.out.println(this.name + "...equals.." + p.name);//      equals  

		return this.name.equals(p.name) && this.age == p.age;
	}

}
三、TreeSet集合
_;--TreeSet:Setセットの要素を並べ替えることができます.一番下のデータ構造は二叉ツリーです.
また、中に入れる対象は比較性を備えて並べ替え、最後に預け入れます.
 
1、元素の一意性を保証する根拠:compreTo方法とreturn  0;
 
2、TreeSetの並べ替え方法
    1>TreeSet順序付けの第一の方式:要素自体に比較性を持たせる.
      素子はComprableインターフェースを実現し、compreToメソッドをカバーする必要があります.
      オブジェクトが存在すると比較性が備わっているので、形式を元素ともいう自然の順序、またはデフォルトの順序ともいう.
注意:主な条件が同じであれば、副次的な条件を判断します.
 
要素自身に比較的なコード例を持たせます.
必要:
TreeSetセットにカスタム対象の学生を格納します.
学生の対象を並べ替えます.学生の年齢は主な条件で、名前は第二条件です.
 
class Student implements Comparable {//              。

	private String name;
	private int age;

	Student(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public int compareTo(Object obj) {
	
		//return 1;		          
		//return -1;		          

		if (!(obj instanceof Student))
			throw new RuntimeException("      ");
		Student s = (Student) obj;

		System.out.println(this.name + "....compareto....." + s.name);

		if (this.age > s.age)
			return 1;
		if (this.age == s.age) {	//       ,      
		
			return this.name.compareTo(s.name); // String     compareTo  (        )
		}
		return -1;
	}

	public String getName() {
		return name;

	}

	public int getAge() {
		return age;
	}
}

class TreeSetDemo {
	public static void main(String[] args) {
		TreeSet ts = new TreeSet();

		ts.add(new Student("lisi02", 22));
		ts.add(new Student("lisi007", 20));
		ts.add(new Student("lisi09", 19));
		ts.add(new Student("lisi08", 19));
		// ts.add(new Student("lisi007",20));
		// ts.add(new Student("lisi01",40));

		Iterator it = ts.iterator();
		while (it.hasNext()) {
			Student stu = (Student) it.next();
			System.out.println(stu.getName() + "..." + stu.getAge());
		}
	}
}
2>    TreeSetの第二のソート方式:容器自体に比較性を持たせます.
  「元素」自身が比較性を備えていない場合、comprableが実現されていない、または必要でない比較性を備えている場合は、「容器」自身に比較性を持たせ、
  コンパレータを定義し、コンパレータオブジェクトをパラメータとしてTreeSetセットの構築関数に渡す.
 
実現方式:クラスを定義し、Compratorインターフェースを実現し、compareメソッドをカバーする.
コンパレータをセット初期化時に導入する
 
注意:両方の並べ替えが存在する場合、比較器を中心とします.
 
容器自体に比較性を持たせるコード例:
 
需要:TreeSetセットにカスタマイズ対象の学生を格納します.
対象を並べ替えます.学生の名前は主な条件で、年齢は二次条件です.
//      :       ,       
class MyCompare implements Comparator {
	public int compare(Object o1, Object o2) {
		Student2 s1 = (Student2) o1;
		Student2 s2 = (Student2) o2;

		int num = s1.getName().compareTo(s2.getName());
		if (num == 0) {
			
			//              :  Integer     comparTo  
			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
			
			/*
			 if(s1.getAge()>s2.getAge()) return 1;
			 if(s1.getAge()==s2.getAge()) return 0; return -1;
			 */
		}
		return num;

	}
}

class Student2 implements Comparable//              。
{
	private String name;
	private int age;

	Student2(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public int compareTo(Object obj) {

		// return 0;

		if (!(obj instanceof Student2))
			throw new RuntimeException("      ");
		Student2 s = (Student2) obj;

		// System.out.println(this.name+"....compareto....."+s.name);
		if (this.age > s.age)
			return 1;
		if (this.age == s.age) {
			return this.name.compareTo(s.name);
		}
		return -1;

	}

	public String getName() {
		return name;

	}

	public int getAge() {
		return age;
	}
}



class TreeSetDemo2 {
	public static void main(String[] args) {
		TreeSet ts = new TreeSet(new MyCompare());

		ts.add(new Student2("lisi", 22));
		ts.add(new Student2("lisi", 21));
		ts.add(new Student2("lisi7", 20));
		ts.add(new Student2("lisi9", 19));
		ts.add(new Student2("lisi06", 18));
		ts.add(new Student2("lisi06", 18));
		ts.add(new Student2("lisi007", 29));
		// ts.add(new Student("lisi007",20));
		// ts.add(new Student("lisi01",40));

		Iterator it = ts.iterator();
		while (it.hasNext()) {
			Student2 stu = (Student2) it.next();
			System.out.println(stu.getName() + "..." + stu.getAge());
		}
	}
}
練習します
TreeSet練習:文字列の長さで並べ替えます.
 
説明:文字列自体は比較性があります.しかし、その比較は必要ではありません.
この場合はコンパレータしか使えません.
 
注意問題:主要条件が同じであれば、副次的条件の比較を行います.
import java.util.*;

class StrLenComparator implements Comparator{
	public int compare(Object o1,Object o2){
		
		String s1 = (String)o1;
		String s2 = (String)o2;

		/*
		if(s1.length()>s2.length())
			return 1;
		if(s1.length()==s2.length())
			return 0;
			*/

		int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
		if(num==0)
			return s1.compareTo(s2);

		return num;
	}
}

class  TreeSetTest{	
	public static void main(String[] args){
		
		TreeSet ts = new TreeSet(new StrLenComparator());

		ts.add("dfsd");
		ts.add("cc");
		ts.add("cba");
		ts.add("aaa");
		ts.add("gs");
		ts.add("fsfef");

		for(Iterator it = ts.iterator();it.hasNext()){
			System.out.println(it.next());
		}
	}
}
TreeSet練習二:文字列の数値を並べ替え、TreeSetを使って完了します.
 
考え方
1,文字列をカットします.
2これらのオブジェクトはTreeSetのセットに預け入れられます.TreeSet自体はソート機能を備えています.
import java.util.*;
class TreeSetTest2 {
	public static void main(String[] args) {

		ArrayList al = new ArrayList();

		String str = "90 -7 0 18 2 45 4";

		String[] arr = str.split(" ");

		TreeSet ts = new TreeSet();

		for(int x=0; x<arr.length; x++){
			//ts.add(new Integer(arr[x]));
			ts.add(Integer.parseInt(arr[x]));//
		}
		System.out.println(ts);
	}
}