Javaベース---集合フレームワーク---反復器、ListIterator、Vectorでの列挙、LinkedList、ArrayList、HashSet、TreeSet、二叉木、Comparator


なぜ集合クラスが現れたのですか?
オブジェクト向け言語は物事の体現がオブジェクトの形式であるため,複数のオブジェクトの操作を容易にするためにオブジェクトを格納し,集合はオブジェクトを格納する最も一般的な方式である.配列と集合クラスは同じコンテナで、何が違いますか?配列はオブジェクトを格納することもできるが、長さは固定され、集合長は可変であり、配列には基本データ型を格納することができ、集合はオブジェクト集合クラスの特徴集合のみを格納することができ、集合長は可変であり、集合は同類型のオブジェクトを格納することができる.collectionには2つの一般的なインタフェースがあり、1つはListでもう1つはSet ListにArrayList、LinkedList、VectorSetにHashSetがあり、もう1つはTreeSetがなぜこんなに多くの容器が現れたのか.各コンテナはデータの格納方式が異なるため、この格納方式をデータ構造と呼ぶ.collection共通性.remove()clear()を削除するとretainAll()が交差し、同じ要素のみが保持されますIterator:インタフェース型参照は、自分のサブクラスオブジェクトに対して反復器とは何ですか?実は集合の取り出し要素が直接要素を操作し、集合の中で内部が最も便利です.内部クラスを定義します普通は判断して、あるなら、取ります.取り出し方式は集合の内部に定義され、取り出し方式は集合内容の要素に直接アクセスできるようになり、取り出し方式は内部クラスと定義され、各コンテナのデータ構造が異なるため、取り出しの動作の詳細も異なるが、共通の内容があり、判断と取り出しがあれば、書く共通性を抽出することができる.では、これらの内部クラスはIteratorであり、集合の取り出しオブジェクトをどのように取得するかというルールに合っています.外部に提供される方法によって、Iterator()はゲームセンターの人形を捕まえるクリップに相当し、この反復器は内部にカプセル化され、外部にはインタフェース容器が一つのものであり、内部にはもう一つのものがあり、このものは内部類である.次のfor(Iterator it=al.Iterator()を見てください.it.hasNext();){ sop(it.next()); } この中のIterator itは局所変数です.使い終わったら解放されるかもしれません.オブジェクトが内部に存在することを回避します.Collection---|list:------|ArrayList:最下位のデータ構造は配列構造を使用しており、クエリー速度が速いことが特徴です.しかし、削除が少し遅く、初期量が10の空のリストを作成します.-----|LinkedList:下位層で使用されるチェーンテーブルデータ構造.特徴:削除速度が速く、検索が少し遅い.-----|Vector:最下位は配列データ構造です.スレッド同期は、ArrayListに置き換えられます.VectorとArrayListはいずれも初期量が10であり、長さを超えると延長され、vectorは20まで延長され、ArrayListは15までしか延長されないので、より省スペースです.要素は秩序化されており、要素は重複することができます.この集合体系にはインデックスがあるからです.指定した場所にインデックス番号を挿入できます.足付きマークは、いずれも特有の方法です.位置の要素を変更できます.増:add(index element);addAll(intdex,collection); 削除:remove変更:set(index,element)検索:get(index)subList(from,to)listIterator()Set:要素は無秩序で、要素は繰り返してはいけません.1つの要素に対してコレクション操作を実行したり、反復器操作を実行したりすることはできません.これにより、ListIteratorはIteratorのサブインタフェースです.反復時に、集合オブジェクトのメソッドで集合内の要素を操作することはできません.ConcurrentModificationException異常が発生するためです.したがって、反復器では、反復器の見逃し操作要素しか使用できません.しかしIteratorメソッドは限られており,要素判断,取り出し,削除の操作しかできない.他の操作の追加、修正などが必要な場合は、そのサブインタフェースが必要です.ListIterator. このインタフェースは、リストセットのlistIteratorによってのみVectorサポート列挙を取得できます.Iteratorはいません列挙はVector特有の取り出し方で、列挙と反復器が似ていることがわかりますが、実は列挙と反復は同じです.列挙された名前やメソッドの名前が長すぎるため
だから反復器に取って代わられた.
列挙が鬱々として終わる
Linklistの特有の使い方:getFirst();getLast();//要素を取得しますが、要素addFirst()/を削除しません.要素addLast()を追加します.removeLast();//要素removeFirst()を削除します.JDK 1.6:pollFirst()このリストの最初の要素を取得して削除します.このリストが空の場合nullが返されます.pollLast()このリストの最後の要素を取得して削除します.このリストが空の場合nullが返されます.peekFirst()は、このリストの最初の要素を取得しますが、削除しません.このリストが空の場合nullが返されます.peekLast()は、このリストの最後の要素を取得しますが、削除しません.このリストが空の場合nullが返されます. 
class LinkedListDemo{
	public static void main(){
		Linked link=new LinkedList();
		link.addList("java01");
		link.addlist("java02");
		
		while(!link.isEmpty()){
			sop(link.removeLast());
		}
		
	
	}	
	public static void sop(Object object){
		System.out.println("obj");
	}
	
}

LinkedListを使用してスタックまたはキューデータ構造スタックをシミュレートします.コップのような先進的な後出です.キュー:水道管のように先に出ます.
class Queue{
	private LinkedList link;
	Queue{
		link=new LinkedList();
	}
	public void myadd(Object obj){
		link.addFirst(obj);
	}
	public Object myGet(){
		return link.removeLast();
	}
	public boolean isNull(){
		return link.isEmpty();
	}
	
}

ArrayListの重複要素を除去するには:
classArraylistTest{
	public static void  main(){
		ArrayList a1=new ArrayList();
		a1.add("java01");
		a1.add("java01");
		a1.add("java01");
		a1.add("java01");
		a1.add("java01");
		
		sop(a1);
		a1=singleElement(a1);
		sop(a1);
	}
	
	public static ArrayList singleElement(ArrayList al){
		ArrayList newAl=new ArrayList();
		Iterator it=al.iterator();
		while(it.hasNext()){
			Object obj=it.next();
			if(newAl.contains(obj)){
				newAl.add(obj);
			}
		
		}
		return newAl;
		
	}
	public static void sop(Object object){
		System.out.println("obj");
	}
	
}
class Person{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public boolean equals(Object object){
		if(!obj instanceof Person)
			return false;
		Person p=(Person)Obj;
		return this.name.equals(p.name)&&this.age=p.age;
		
	}
	
	
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
	
}
Class ArrayListTest2{
	public static void main(String[] args){
		ArrayList a1=new ArrayList();
		a1.add(new Person("lisi01,30"));
		
		Iterator it=al.iterator();
		while(it.hasNext()){
			// , , , obj
			Object obj=it.next();
			Person p=(Person) obj;
			sop(it.next().getName()+"::"+it.next().getAge());
		}
		
	}
	
	public static ArrayList singleElement(ArrayList al){
		ArrayList newAl=new ArrayList();
		Iterator it=al.iterator();
		while(it.hasNext()){
			Object obj=it.next();
			if(newAl.contains(obj)){
				newAl.add(obj);
			}
		
		}
		return newAl;
		
	}
}

いつlinkedList、いつArrayListを使いますか?答:操作するデータが比較的多い場合、かつ要素に比較的頻繁な削除データが含まれている場合、LinkedListになる.同時に削除を使用し、同時にクエリーを使用し、ArrayListを使用することを提案した.ArrayListはLinkedListよりもよく使われています.ヒント:多くの下位層がequalsを呼び出しています.なぜですか.例,remove,この中では,先に判断を行い,判断さえあればequalsがある.私たちには見えないだけです.ArrayListとLindListは、containsでもremoveでも、耐equalsメソッドSet:要素無秩序(格納されたデータ)----|下位データ構造はハッシュテーブルHashSetがどのように要素の一意性を保証しているのか.要素の2つの方法,hashcodeとequalsによって完成した.要素Hashcodeの値が異なる場合、equalsがtrueであるか否かが判断される.要素のHashCode値が異なる場合、equalsがtrueであるか否かが判断される.要素のhashcode値が異なる場合、equalsが使用されます.注意:要素が存在するかどうかを判断したり、削除したりする操作には、要素HashCodeやEqualsメソッドが依存します.set集合とcollectionが一致するハッシュテーブルはハッシュ値に従って格納される削除する要素であり,要素を判断するにはHash値を判断しなければならない.中のequalsメソッドを呼び出します.独自のハッシュ値を持つ文字列はありません.私たちは名前を書くことができます.hasCode();この方法
class HashSetDemo 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		
		HashSet hs = new HashSet();


		sop(hs.add("java01"));
		sop(hs.add("java01"));
		hs.add("java02");
		hs.add("java03");
		hs.add("java03");
		hs.add("java04");


		Iterator it = hs.iterator();


		while(it.hasNext())
		{
			sop(it.next());
		}
	}
}

Set:要素は無秩序であり、格納と取り出しの順序が必ずしも一致しないため、要素は繰り返してはならない.
import java.util.*;


/*
 hashSet 
 , 。
*/
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 Person("a1",11));
		hs.add(new Person("a2",12));
		hs.add(new Person("a3",13));
//		hs.add(new Person("a2",12));
//		hs.add(new Person("a4",14));


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


		Iterator it = hs.iterator();


		while(it.hasNext())
		{
			Person p = (Person)it.next();
			sop(p.getName()+"::"+p.getAge());
		}
	}
}
class Person
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public int hashCode()
	{
		System.out.println(this.name+"....hashCode");
		return name.hashCode()+age*37;// 37, 。 
	}


	public boolean equals(Object obj)// ,
	{


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


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


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


	
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
}

要素の一意性を保証する原理:要素のHashCodeの値が同じかどうかを判断し、同じであれば要素のEqualsメソッドを判断し続ける.true.----|TreeSet:Setコレクションの要素をソートできます.anscIIの値が小さい順に前にします.下位データ構造は二叉木であり、要素の一意性を保証する根拠はCompareToメソッドreturn 0である.hash値とは何の関係もありません.要素の修正、削除、検索はすべてCompareTO TreeSetソートの第1の方法を使用して、要素自身に比較性を備えさせます.要素は、Compareableインタフェースを実装し、CompareToメソッドを上書きする必要があります.この方法は要素の自然ソートとも呼ばれる.あるいはデフォルトのソートと呼ばれます.第2のソート方式:要素自体が比較性を備えていない場合、または備える比較性が必要でない場合、集合自体に比較性を持たせる必要がある.集合初期化時に比較方式があります.TreeSet(Comparatorcomparator)は、指定したコンパレータに従ってソートされる新しい空のTreeSetを構築します.2つのソートが存在する場合、比較器を主としてクラスを定義し、comparatorインタフェースを実現し、comparareメソッドを上書きします.インタフェースは対外的に提供される公共拡張です.需要:Treesetコレクションにカスタムオブジェクトを格納学生が学生の年齢別にソートしたい場合.覚えておいてください:並べ替えの場合、主な条件が同じである場合、次の条件で並べ替えを行うClassCastExceptionタイプ変換異常を判断しなければなりません.
Class TreeSetDemo(){
	public static void main(){
		TreeSet ts=new TreeSet();
		ts.add(new Student("liuhan",22));
		ts.add(new Student("diudan",24));// // , 
		Iterator it=ts.Iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}
Class Student implements Comparable{// 
	private String name;
	private int age;
	Student (String name,int age){
		this.name=name;
		this.age=age;
	}
	public int CompareTo(){
		if(!(obj instanceof Student))
		throw new RuntimeException(" ");
		Student s=(Student)Obj;
		System.out.println(this.name+"...Compare to"+s.name);
		if(this.age>s.age)// 
		return 1;
		if(this.age==s.age)
		{
			this.name.compareTo(s.name);// , 
		}
	// , 。
		return 0;
		return -1;
	}
	public String getName(){
		return name;
	}
	public String getAge(){
		return age;
	}
}
class MyCompare implements Comparator{
	public int compare(Object o1,Object o2){
		Student s1=(Student)o1;
		Student s2=(Student)o2;
		
		int num=s1.getName().compareTo(s2.getName());
		if(num==0){
			return s1.getAge()-s2.getAge();
			// , CompareTo
			return new Integar(s1.getAge()).compareTo(new Integer(s2.getAge()));
		}
		
		return num;
	}
}

練習:文字列の長さに基づいて文字列をソートすること自体が比較性を備えています.しかし、その技術は私たちに必要なものではありません.この場合、コンパレータしか使用できません.
import java.util.*;
class  TreeSetTest
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet(new StrLenComparator());


		ts.add("abcd");
		ts.add("cc");
		ts.add("cba");
		ts.add("aaa");
		ts.add("z");
		ts.add("hahaha");


		Iterator it = ts.iterator();


		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}


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;
	}
}