【Java】JavaにおけるCollectionsクラス――Javaにおけるアップグレード版のデータ構造
一般的に、教科書のデータ構造には、配列、単一チェーンテーブル、スタック、ツリー、図が含まれます.私がここで指しているデータ構造は、オブジェクトをどのように表すかという問題です.int、String、double、さらには1次元配列、2次元配列では、表現するものを完全に表現できないこともありますが、クラスクラスを定義するのは面倒です.JavaのCollectionsクラスを使うことを考えてみてください.Collectionsクラスを使用するには、import java.util.*をファイルヘッダに宣言する必要があります.
一、動的、秩序的、可変サイズの一次元配列VectorとArrayList
Collectionsクラスには、動的、秩序的、可変サイズの1次元配列VectorとArrayListが含まれています.
VectorとArrayListの唯一の違いは、vectorがスレッドを持って反発し、複数のスレッドが読み書きに異常を投げ出すことであり、arraylistは複数のスレッドの読み書きを許可し、他の部分はそっくりである.言い換えれば、単一のスレッドが読み書きされている場合、Vectorを使用してArrayListと何の違いもないが、現在のプログラミングでは基本的にArrayListを使用している.Vectorを使うのはちょっと非主流ですが、
1、Vectorの使用は以下の通りです.
実行結果は次のとおりです.
=======Vectorデータ構造のテスト開始====単純addは末尾から要素を加えることを表す:[1.6,2.06,1]size()vectorの含む要素の個数を求めることができる:3 remove(1)は1番目の要素を削除することを表し、カウントが0から始まるため、2.06という要素:[1.6,1]最後の要素を削除するvectorは:[1.6]0番目の位置に1.8888という要素を加える:[1.8888,1.6]0番目の位置という要素をa:[a,1.6]=====Vectorデータ構造のテスト終了=====
2、ArrayList
ここで、ArrayListが最後の要素を削除する方法はVectorとは異なり、主にArrayListはlastElement()という方法で最後の要素remove()を削除するのではなく、arraylist.size()-1で最後の要素の位置を決定するしかありません.メイン関数でこの方法を呼び出すと、
次の実行結果が得られます.
=======ArrayListデータ構造のテスト開始======単純addは末尾から要素を加えることを表す:[1.0,4.0,5.0,2.3]size()は含まれる要素の個数を求めることができる:4 remove(1)は1番目の要素を削除することを表し、カウントが0から始まるため、つまり4という要素:[1.0,5.0,2.3]最後の要素を削除したarraylistは:[1.0,5.0]0番目の位置に1.8888という要素を加える:[1.888,1.0,5.0]0番目の位置という要素をa:[9.0,1.0,5.0]arraylistが抽象的なタイプでない場合、ソートをサポートする[1.0,5.0,9.0]====ArrayListデータ構造のテスト終了======
上記の2つの例から,VectorはArrayListと比較して一般的な配列,すなわち教科書で教えられている1次元配列int array[]={8,7,100,88,6,4,5,33,7}であることがわかる.;非常に強力で、任意の位置に要素を挿入することもできるし、配列を巡回することなく指定された位置の要素を削除することもできます.もちろん、この配列がどのように巡回しているかを試験する必要があります.実際、ArrayListは普通の1次元配列と完全に相互回転を実現することができ、ArrayListを利用してarrayを直接ソートすることもできます.arraを並べ替える必要はありませんyバブルソートなどを書いて、Collections.sort()を直接使います.配列をソートして、Collections.reverse()を使います.逆ソートを実現することができます.もちろん、その文です.この配列がどのようにソートされているかをテストします.
例えば、1次元配列int array[]={8,7,100,88,6,4,5,33,7};の並べ替えと逆並べ替えを実現し、まず配列をArrayListに変換してCollections.sort();Collections.reverse();並べ替え、最後にArrayList内容を1次元配列に変換する.
===============8,7100,88,6,4,5,33,7,並べ替え後の配列:4,5,6,7,8,33,88100,逆並べ替え後の配列:100,88,33,8,7,7,6,5,4,
======Java配列ソート終了======
また、前述の「【Java】Listの使用」(クリックしてリンクを開く)も同様です
二、集合HashSet
また、集合HashSetもあり、HashSetは数学的な集合概念にそっくりです.1つ以上の要素からなるものを集合といいます.HashSetは、
1.確定性、集合の中の要素は確定しなければならない.これはくだらない話で、確定しなければならない.まさか私は中に不確定なものを入れてもいいのだろうか.
2.互いに異性であり、集合中の要素は互いに異なる.例えば、集合A={1,a}の場合、aは1に等しくない.つまり、2つの1をHashSetに入れると自動的に1になる
3.無秩序性、集合中の要素は前後の区別がない.したがってHashSetも並べ替え操作を行うことができない
たとえば、次の方法があります.
結果は次のとおりです.
======HashSetデータ構造のテスト開始=====単純なaddは、末尾から要素を加えることを表す:[1,5,2.3]size()は、含まれる要素の個数を求めることができる:3 remove(1)は、'1'という要素を削除することを表す:[5,2.3]asd'という要素がなければremoveは何もしない:[5,2.3]1.8888という要素を加える:[5,1.8888,2.3]===HashSetデータ構造のテスト終了===
HashSetにはadd()メソッドとremove()メソッドがあり、add()に加えられた要素は順序がなく、System.out.println()で印刷されるたびに順序が異なる場合があり、上のVectorにArrayListと同様に、存在する要素がObjectでない限りCollections.sort(arraylist)を使用してソートすることはできません.
三、二元組HashMap
ここでの使用方法は上のデータとほぼ同じで、簡単です.putメソッドがオブジェクトをmapに入れ、getはmapのオブジェクトを取り出すことができますが、二元グループHashMapを三元グループにしようとするのは間違っています.1つのオブジェクトに要素が多すぎる場合は、クラスを考慮する必要があります.Java仲介に夢中になっているのではなく、一般変数とClassクラスの間のCollectioに夢中になっているわけではありません.nsクラス.
たとえば、HashMapを三元グループに変更しようとするエラー操作を以下の方法で示します.
=======================================================================================================================================================================
このプログラムの本来の意図は明らかであり,{test 1,key 1,1},{test 1,key 2,2},{test 2,key 3,3},{test 2,key 4,4}を構築しようとした.
しかし、bigmapごとにそのmapが保存されています.mapを空にすると、test 1のmapも同じように空になります.
複数のmap 1,map 2を作成しようとする人もいますが...簡単なクラスを使って、より明確に見え、クラスの中で後で方法を書くことができ、継承されています.
四、備考
新しいVectorを作って、Arraylistは良くて、HashSetも、HashMapも、完全に書くことができます:
Collectionインタフェースに継承されているのはArrayList、Vector、Linkedlist、HashSet、TreeSetであり、MAPインタフェースに継承されているのはHashMap、Hashtableである.これはJavaにおけるクラスの継承、マルチステート、パッケージングなどの問題である.もちろん、あなたの仲間がよりはっきり見えるように、ここでは派手なネーミングをする必要はなく、はっきりしたArrayListarraylist=new ArrayList();Javaのクラスが分からないと言う人はいません.
一、動的、秩序的、可変サイズの一次元配列VectorとArrayList
Collectionsクラスには、動的、秩序的、可変サイズの1次元配列VectorとArrayListが含まれています.
VectorとArrayListの唯一の違いは、vectorがスレッドを持って反発し、複数のスレッドが読み書きに異常を投げ出すことであり、arraylistは複数のスレッドの読み書きを許可し、他の部分はそっくりである.言い換えれば、単一のスレッドが読み書きされている場合、Vectorを使用してArrayListと何の違いもないが、現在のプログラミングでは基本的にArrayListを使用している.Vectorを使うのはちょっと非主流ですが、
1、Vectorの使用は以下の通りです.
public static void Vectortest() {
// Vector<Double> vector double
// Vector<String> vector String
// Vector<Object> vector=new Vector<Object>(); Vector vector=new
// Vector(); ,eclipse , Vector ,╮(╯▽╰)╭
Vector<Object> vector = new Vector<Object>();
vector.add(1.6);
vector.add(2.06);
vector.add(1);
System.out.println(" add :" + vector);
System.out.println("size() vector :" + vector.size());
vector.remove(1);
System.out.println("remove(1) 1 , 0 , 2.06 :" + vector);
vector.remove(vector.lastElement());
System.out.println(" vector :" + vector);
vector.add(0, 1.8888);
System.out.println(" 0 1.8888 :" + vector);
vector.set(0, "a");
System.out.println(" 0 a:" + vector);
}
このメソッドがメイン関数で呼び出された場合: System.out.println("======Vector ======");
Vectortest();
System.out.println("======Vector ======");
実行結果は次のとおりです.
=======Vectorデータ構造のテスト開始====単純addは末尾から要素を加えることを表す:[1.6,2.06,1]size()vectorの含む要素の個数を求めることができる:3 remove(1)は1番目の要素を削除することを表し、カウントが0から始まるため、2.06という要素:[1.6,1]最後の要素を削除するvectorは:[1.6]0番目の位置に1.8888という要素を加える:[1.8888,1.6]0番目の位置という要素をa:[a,1.6]=====Vectorデータ構造のテスト終了=====
2、ArrayList
public static void ArrayListtest() {
ArrayList<Double> arraylist = new ArrayList<Double>();
arraylist.add(1.0);
arraylist.add(4.0);
arraylist.add(5.0);
arraylist.add(2.3);
System.out.println(" add :" + arraylist);
System.out.println("size() :" + arraylist.size());
arraylist.remove(1);
System.out.println("remove(1) 1 , 0 , 4 :" + arraylist);
arraylist.remove(arraylist.size() - 1);
System.out.println(" arraylist :" + arraylist);
arraylist.add(0, 1.8888);
System.out.println(" 0 1.8888 :" + arraylist);
arraylist.set(0, 9.0);
System.out.println(" 0 a:" + arraylist);
Collections.sort(arraylist);
System.out.println(" arraylist , " + arraylist);
}
ここで、ArrayListが最後の要素を削除する方法はVectorとは異なり、主にArrayListはlastElement()という方法で最後の要素remove()を削除するのではなく、arraylist.size()-1で最後の要素の位置を決定するしかありません.メイン関数でこの方法を呼び出すと、
System.out.println("======ArrayList ======");
ArrayListtest();
System.out.println("======ArrayList ======");
次の実行結果が得られます.
=======ArrayListデータ構造のテスト開始======単純addは末尾から要素を加えることを表す:[1.0,4.0,5.0,2.3]size()は含まれる要素の個数を求めることができる:4 remove(1)は1番目の要素を削除することを表し、カウントが0から始まるため、つまり4という要素:[1.0,5.0,2.3]最後の要素を削除したarraylistは:[1.0,5.0]0番目の位置に1.8888という要素を加える:[1.888,1.0,5.0]0番目の位置という要素をa:[9.0,1.0,5.0]arraylistが抽象的なタイプでない場合、ソートをサポートする[1.0,5.0,9.0]====ArrayListデータ構造のテスト終了======
上記の2つの例から,VectorはArrayListと比較して一般的な配列,すなわち教科書で教えられている1次元配列int array[]={8,7,100,88,6,4,5,33,7}であることがわかる.;非常に強力で、任意の位置に要素を挿入することもできるし、配列を巡回することなく指定された位置の要素を削除することもできます.もちろん、この配列がどのように巡回しているかを試験する必要があります.実際、ArrayListは普通の1次元配列と完全に相互回転を実現することができ、ArrayListを利用してarrayを直接ソートすることもできます.arraを並べ替える必要はありませんyバブルソートなどを書いて、Collections.sort()を直接使います.配列をソートして、Collections.reverse()を使います.逆ソートを実現することができます.もちろん、その文です.この配列がどのようにソートされているかをテストします.
例えば、1次元配列int array[]={8,7,100,88,6,4,5,33,7};の並べ替えと逆並べ替えを実現し、まず配列をArrayListに変換してCollections.sort();Collections.reverse();並べ替え、最後にArrayList内容を1次元配列に変換する.
public static void arrayListSort() {
int array[] = { 8, 7, 100, 88, 6, 4, 5, 33, 7 };
ArrayList<Integer> arraylist = new ArrayList<Integer>();
for (int i = 0; i < array.length; i++)
System.out.print(array[i] + ",");
for (int i = 0; i < array.length; i++)
arraylist.add(array[i]);
Collections.sort(arraylist);
for (int i = 0; i < array.length; i++)
array[i] = arraylist.get(i);
System.out.print(" :");
for (int i = 0; i < array.length; i++)
System.out.print(array[i] + ",");
Collections.reverse(arraylist);
for (int i = 0; i < array.length; i++)
array[i] = arraylist.get(i);
System.out.print(" :");
for (int i = 0; i < array.length; i++)
System.out.print(array[i] + ",");
// arraylist
arraylist = null;
// Java , ,Java
System.gc();
}
メイン関数でメソッドを呼び出します. System.out.println("======Java ======");
arrayListSort();
System.out.println("======Java ======");
では、次のような実行結果が得られます.===============8,7100,88,6,4,5,33,7,並べ替え後の配列:4,5,6,7,8,33,88100,逆並べ替え後の配列:100,88,33,8,7,7,6,5,4,
======Java配列ソート終了======
また、前述の「【Java】Listの使用」(クリックしてリンクを開く)も同様です
二、集合HashSet
また、集合HashSetもあり、HashSetは数学的な集合概念にそっくりです.1つ以上の要素からなるものを集合といいます.HashSetは、
1.確定性、集合の中の要素は確定しなければならない.これはくだらない話で、確定しなければならない.まさか私は中に不確定なものを入れてもいいのだろうか.
2.互いに異性であり、集合中の要素は互いに異なる.例えば、集合A={1,a}の場合、aは1に等しくない.つまり、2つの1をHashSetに入れると自動的に1になる
3.無秩序性、集合中の要素は前後の区別がない.したがってHashSetも並べ替え操作を行うことができない
たとえば、次の方法があります.
public static void HashSettest() {
HashSet<Object> hashset = new HashSet<Object>();
hashset.add(1);
hashset.add(1);
hashset.add(5);
hashset.add(2.3);
System.out.println(" add :" + hashset);
System.out.println("size() :" + hashset.size());
hashset.remove(1);
System.out.println("remove(1) '1' :" + hashset);
hashset.remove("asd");
System.out.println(" 'asd' remove :" + hashset);
hashset.add(1.8888);
System.out.println(" 1.8888 :" + hashset);
}
メイン関数で、このメソッドを呼び出します. System.out.println("======HashSet ======");
HashSettest();
System.out.println("======HashSet ======");
結果は次のとおりです.
======HashSetデータ構造のテスト開始=====単純なaddは、末尾から要素を加えることを表す:[1,5,2.3]size()は、含まれる要素の個数を求めることができる:3 remove(1)は、'1'という要素を削除することを表す:[5,2.3]asd'という要素がなければremoveは何もしない:[5,2.3]1.8888という要素を加える:[5,1.8888,2.3]===HashSetデータ構造のテスト終了===
HashSetにはadd()メソッドとremove()メソッドがあり、add()に加えられた要素は順序がなく、System.out.println()で印刷されるたびに順序が異なる場合があり、上のVectorにArrayListと同様に、存在する要素がObjectでない限りCollections.sort(arraylist)を使用してソートすることはできません.
三、二元組HashMap
ここでの使用方法は上のデータとほぼ同じで、簡単です.putメソッドがオブジェクトをmapに入れ、getはmapのオブジェクトを取り出すことができますが、二元グループHashMapを三元グループにしようとするのは間違っています.1つのオブジェクトに要素が多すぎる場合は、クラスを考慮する必要があります.Java仲介に夢中になっているのではなく、一般変数とClassクラスの間のCollectioに夢中になっているわけではありません.nsクラス.
たとえば、HashMapを三元グループに変更しようとするエラー操作を以下の方法で示します.
public static void Maptest(){
System.out.println("======Map ======");
HashMap<String,String> map=new HashMap<String, String>();
HashMap<String,HashMap<String, String>> bigmap=new HashMap<String, HashMap<String, String>>();
map.put("key1","1");
map.put("key2","2");
bigmap.put("test1",map);
map.clear();
map.put("key1","3");
map.put("key2","4");
bigmap.put("test2",map);
System.out.println(bigmap);
System.out.println(bigmap.get("test1").get("key1"));
System.out.println(bigmap.get("test1").get("key2"));
System.out.println(bigmap.get("test2").get("key1"));
System.out.println(bigmap.get("test2").get("key2"));
System.out.println("======Map ======");
System.out.println("======Map ======");
map.clear();
bigmap=null;
map.put("key1","1");
map.put("key2","2");
map.put("key3","3");
System.out.println(map);
System.out.println("======Map ======");
}
主関数でこのコードを呼び出し、次の実行結果を得ます.=======================================================================================================================================================================
このプログラムの本来の意図は明らかであり,{test 1,key 1,1},{test 1,key 2,2},{test 2,key 3,3},{test 2,key 4,4}を構築しようとした.
しかし、bigmapごとにそのmapが保存されています.mapを空にすると、test 1のmapも同じように空になります.
複数のmap 1,map 2を作成しようとする人もいますが...簡単なクラスを使って、より明確に見え、クラスの中で後で方法を書くことができ、継承されています.
四、備考
新しいVectorを作って、Arraylistは良くて、HashSetも、HashMapも、完全に書くことができます:
Collection<String> a= new ArrayList<String>();
List<String> a= new Vector<String>();
などCollectionインタフェースに継承されているのはArrayList、Vector、Linkedlist、HashSet、TreeSetであり、MAPインタフェースに継承されているのはHashMap、Hashtableである.これはJavaにおけるクラスの継承、マルチステート、パッケージングなどの問題である.もちろん、あなたの仲間がよりはっきり見えるように、ここでは派手なネーミングをする必要はなく、はっきりしたArrayList