ダークホースプログラマー——学習日記【10】【汎型、MapとCollection】
9592 ワード
----------androidトレーニング、javaトレーニング、あなたとの交流を期待しています.--------
Set:無秩序です.重複してはいけません. |--HashSet:データ構造はハッシュテーブルであり、スレッドは非同期である. 要素の一意性を保証する原理:要素のhashCodeの値が同じかどうかを判断する.もし同じなら、要素のequalsの方法を引き続き判断して、trueですか?
|--TreeSet:Setセットの要素を並べ替えることができます. 下のデータ構造は二叉ツリーです. 要素の一意性を保証する根拠:compreTo方法return 0. HashSetだけがハッシュ値に関連しています.TreeSetは二叉の木を歩いています.TreeSetは、compreTo法により要素が同じかどうかを判定する. TreeSetのセットを削除したいなら、要素が含まれているかどうかを判断します.歩くのはすべてCompreTo方法return 0です.0に戻るなら、要素は同じだと思います.
TreeSet順序付けの第一の方式:要素自体に比較性を持たせる. 素子はComprableインターフェースを実現し、compreToメソッドをカバーする必要があります.このような方法は元素の自然な順序ともいいます.あるいは標準の順序ともいいます.
TreeSetの第二のソート方式 元素自身が比較性を備えていない場合、または備える比較性が必要ではない場合、集合自体に比較性を持たせる必要がある. 集合初期化時には、比較方式があります.
元素自身が比較性を備えていない場合、または備えられている比較性は必要ではない.この場合は容器自体に比較性を持たせる必要があります.コンパレータを定義し、コンパレータオブジェクトをパラメータとしてTreeSetセットに渡す構造関数
二つの並べ替えが存在する場合、比較器を中心とします.
汎型:JDK 1.5以降に新しい特性が現れ、安全問題を解決するために使用されるタイプの安全機構です.
メリット:1、運行時期に発生する問題をクラスCastExceptionに転送し、コンパイル時期にプログラマが問題を解決しやすくなり、運行時期に問題が減少し、安全になります.
2、強制転換のトラブルを避ける
汎型書式:動作する参照データの種類を<>で定義します.
javaが提供する対象を使う時、いつ汎型を書きますか?
通常、集合のフレームワークでよく見られますが、「」を見たら汎型を定義します.実は、「」は受信タイプのものです.
セットを使用すると、セットに格納するデータの種類をパラメータとして<>に渡すだけでいいです.
汎型クラス定義の汎型は、全体のクラスで有効です.方法で使われたら.一般クラスのオブジェクトは、特定のタイプの操作を明確にした後、操作するタイプはすべて固定されています.異なる方法で異なるタイプの操作ができるように、タイプはまだ確定されていません.汎型を方法に定義することができます.
特殊な点:静的方法はクラスで定義された汎型にアクセスできない.静的方法で動作するアプリケーションデータのタイプが不確定であれば、汎型を方法に定義することができる.
注意:汎型定義は方法上、戻り値タイプの前に置く必要があり、修飾子の後ろにあります.
?ワイルドカードは、プレースホルダとしても理解できます.
汎型の限定:【汎型の高級応用、汎型の複合応用】
? extens E:EタイプまたはEのサブタイプが受信できます.上限は?super E:EタイプまたはEの親タイプ、下限が受信できます.
Mapセット:このセットはキーパッドのペアを記憶して、一対のペアは中に保存して、しかもキーの一意性を保証します. 1,追加 put(K key,V value) putAll(Map extends K,?extends V>m)
2,削除 clear() remove(Object key)
3,判断する containsValue(Object value) containsKey(Object key) isempty()
4,取得する get(Object key) size() values()
entrySet() keySet()
Map |--Hashtable:一番下はハッシュテーブルのデータ構造で、nullキーnull値を預け入れてはいけません. このセットはスレッド同期である.【JDK 1.0】効率が低い
|--HashMap:一番下はハッシュテーブルのデータ構造で、nullキーとnull値の使用が可能です. このセットは同期されていません.【JDK 1.2】効率が高い
|--TreeMap:一番下は二叉ツリーのデータ構造で、スレッドが同期していません.与えられます Mapセットのキーを並べ替えます.
セットと似ていますが、セットの下にはMapセットが使われています.
Map集合の取出原理:map集合をset集合にして、また、シーケンサによって取り出される.
2、セット>entrySet:mapセットのマッピング関係を預けました. セットの中で、この関係のデータの種類はMap.Entryです.
練習:“sdfgzxvasdfxcvdf”はこの文字列のアルファベットの出現回数を取得して、プリント結果を希望します.a(1)c(2)…
構造によって、各文字は対応する回数があり、アルファベットと回数の間にマッピング関係があるということが分かりました.
なお、マッピング関係が発見された場合には、mapのセットに格納されているものがマッピング関係であるため、mapのセットを選択することができる.
いつmapで集合しますか?データ間にマッピング関係がある場合は、まずmap集合を考えます.
考え方:1、文字列を文字配列に変換します.文字列を操作するために
2,mapセットを定義します.印刷結果のアルファベットは順番があるので、treemapでセットします.
3、文字配列を巡回 各文字をキーとしてmapの集合を調べます. nullに戻ると、その文字と1をmapセットに入れます. 戻ってnullでない場合は、map集合に既に文字が存在していて、この場合に対応しています. この回数を取得し、自己増加してから、その文字と増量後の回数を mapセットでは、原理キーに対応する値を上書きします.
4,mapセットのデータを指定された文字列として返します.
対象の大きさを比較するか、compreeか、compreToかを比較します.
詳細forループ
フォーマット:for(データタイプ変数名:巡回された集合または配列){
}セットを巡回すると、セット内の要素しか得られませんが、セットを操作することはできません.
ディケンサは巡回する以外、removeの集合の中の元素の動作を行うことができます.もしListIteratorを使うならば、巡回中に集合を添削して調べることもできます.
伝統forと高級forの違いは何ですか?
高級forには限界があります.遍歴された目標が必要です.行列を遍歴する時、伝統forを使用したいです.伝統forは角標を定義することができます.
Set:無秩序です.重複してはいけません. |--HashSet:データ構造はハッシュテーブルであり、スレッドは非同期である. 要素の一意性を保証する原理:要素のhashCodeの値が同じかどうかを判断する.もし同じなら、要素のequalsの方法を引き続き判断して、trueですか?
|--TreeSet:Setセットの要素を並べ替えることができます. 下のデータ構造は二叉ツリーです. 要素の一意性を保証する根拠:compreTo方法return 0. HashSetだけがハッシュ値に関連しています.TreeSetは二叉の木を歩いています.TreeSetは、compreTo法により要素が同じかどうかを判定する. TreeSetのセットを削除したいなら、要素が含まれているかどうかを判断します.歩くのはすべてCompreTo方法return 0です.0に戻るなら、要素は同じだと思います.
TreeSet順序付けの第一の方式:要素自体に比較性を持たせる. 素子はComprableインターフェースを実現し、compreToメソッドをカバーする必要があります.このような方法は元素の自然な順序ともいいます.あるいは標準の順序ともいいます.
TreeSetの第二のソート方式 元素自身が比較性を備えていない場合、または備える比較性が必要ではない場合、集合自体に比較性を持たせる必要がある. 集合初期化時には、比較方式があります.
元素自身が比較性を備えていない場合、または備えられている比較性は必要ではない.この場合は容器自体に比較性を持たせる必要があります.コンパレータを定義し、コンパレータオブジェクトをパラメータとしてTreeSetセットに渡す構造関数
二つの並べ替えが存在する場合、比較器を中心とします.
/*
:
,
*/
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("hahahaha");
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;
}
}
汎型:JDK 1.5以降に新しい特性が現れ、安全問題を解決するために使用されるタイプの安全機構です.
メリット:1、運行時期に発生する問題をクラスCastExceptionに転送し、コンパイル時期にプログラマが問題を解決しやすくなり、運行時期に問題が減少し、安全になります.
2、強制転換のトラブルを避ける
汎型書式:動作する参照データの種類を<>で定義します.
javaが提供する対象を使う時、いつ汎型を書きますか?
通常、集合のフレームワークでよく見られますが、「」を見たら汎型を定義します.実は、「」は受信タイプのものです.
セットを使用すると、セットに格納するデータの種類をパラメータとして<>に渡すだけでいいです.
class GenericDemo
{
public static void main(String[] args)
{
ArrayList a1 = new ArrayList();
a1.add("abc01");
a1.add("abc0991");
a1.add("abc014");
//a1.add(4);//a1.add(new Integer(4));
Iterator it = a1.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s+":"+s.length());
}
}
}
汎型クラス定義の汎型は、全体のクラスで有効です.方法で使われたら.一般クラスのオブジェクトは、特定のタイプの操作を明確にした後、操作するタイプはすべて固定されています.異なる方法で異なるタイプの操作ができるように、タイプはまだ確定されていません.汎型を方法に定義することができます.
特殊な点:静的方法はクラスで定義された汎型にアクセスできない.静的方法で動作するアプリケーションデータのタイプが不確定であれば、汎型を方法に定義することができる.
注意:汎型定義は方法上、戻り値タイプの前に置く必要があり、修飾子の後ろにあります.
?ワイルドカードは、プレースホルダとしても理解できます.
汎型の限定:【汎型の高級応用、汎型の複合応用】
? extens E:EタイプまたはEのサブタイプが受信できます.上限は?super E:EタイプまたはEの親タイプ、下限が受信できます.
Mapセット:このセットはキーパッドのペアを記憶して、一対のペアは中に保存して、しかもキーの一意性を保証します. 1,追加 put(K key,V value) putAll(Map extends K,?extends V>m)
2,削除 clear() remove(Object key)
3,判断する containsValue(Object value) containsKey(Object key) isempty()
4,取得する get(Object key) size() values()
entrySet() keySet()
Map |--Hashtable:一番下はハッシュテーブルのデータ構造で、nullキーnull値を預け入れてはいけません. このセットはスレッド同期である.【JDK 1.0】効率が低い
|--HashMap:一番下はハッシュテーブルのデータ構造で、nullキーとnull値の使用が可能です. このセットは同期されていません.【JDK 1.2】効率が高い
|--TreeMap:一番下は二叉ツリーのデータ構造で、スレッドが同期していません.与えられます Mapセットのキーを並べ替えます.
セットと似ていますが、セットの下にはMapセットが使われています.
import java.util.*;
class MapDemo
{
public static void main(String[] args)
{
Map map = new HashMap();
// , ,
// , put 。
System.out.println("put:"+map.put("01","zhangsan1"));
System.out.println("put:"+map.put("01","wangwu"));
map.put("02","zhangsan2");
map.put("03","zhangsan3");
System.out.println("containsKey:"+map.containsKey("022"));
//System.out.println("remove:"+map.remove("02"));
System.out.println("get:"+map.get("023"));
map.put("04",null);
System.out.println("get:"+map.get("04"));
// get 。
// null 。
// map
Collection coll = map.values();
System.out.println(coll);
System.out.println(map);
}
}
mapセットの2つの取出方法1、Set:mapのすべてのキーをSetセットに保存します.setは重ね着を備えているからです. したがって、すべてのキーを繰り返して取り出して、get方法に従って、各キーに対応する値を取得することができます.Map集合の取出原理:map集合をset集合にして、また、シーケンサによって取り出される.
2、セット>entrySet:mapセットのマッピング関係を預けました. セットの中で、この関係のデータの種類はMap.Entryです.
練習:“sdfgzxvasdfxcvdf”はこの文字列のアルファベットの出現回数を取得して、プリント結果を希望します.a(1)c(2)…
構造によって、各文字は対応する回数があり、アルファベットと回数の間にマッピング関係があるということが分かりました.
なお、マッピング関係が発見された場合には、mapのセットに格納されているものがマッピング関係であるため、mapのセットを選択することができる.
いつmapで集合しますか?データ間にマッピング関係がある場合は、まずmap集合を考えます.
考え方:1、文字列を文字配列に変換します.文字列を操作するために
2,mapセットを定義します.印刷結果のアルファベットは順番があるので、treemapでセットします.
3、文字配列を巡回 各文字をキーとしてmapの集合を調べます. nullに戻ると、その文字と1をmapセットに入れます. 戻ってnullでない場合は、map集合に既に文字が存在していて、この場合に対応しています. この回数を取得し、自己増加してから、その文字と増量後の回数を mapセットでは、原理キーに対応する値を上書きします.
4,mapセットのデータを指定された文字列として返します.
import java.util.*;
class MapTest3
{
public static void main(String[] args)
{
String s = charCount("aakb+fc-dabcd1ke,fa");
System.out.println(s);
}
public static String charCount(String str)
{
char[] chs = str.toCharArray();
TreeMap tm = new TreeMap();
int count = 0;
for(int x=0; x='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
continue;
Integer value = tm.get(chs[x]);
if(value!=null)
count = value;
count++;
tm.put(chs[x],count);
count = 0;
/*
if(value==null)
{
tm.put(chs[x],1);
}
else
{
value = value + 1;
tm.put(chs[x],value);
}
*/
}
//System.out.println(tm);
StringBuilder sb = new StringBuilder();
Set> entrySet = tm.entrySet();
Iterator> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry me = it.next();
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();
}
}
集合フレームの工具類コレクション対象の大きさを比較するか、compreeか、compreToかを比較します.
/*
Arrays:
asList: list
*/
import java.util.*;
class ArraysDemo
{
public static void main(String[] args)
{
//int[] arr = {2,4,5};
//System.out.println(Arrays.toString(arr));
String[] arr = {"abc","cc","kkkk"};
/*
: list ?
:
: , 。
。
contains
get
indexOf()
subList()
, UnsupportedOperationException
*/
List list = Arrays.asList(arr);
//sop("contains:"+list.contains("cc"));
//list.add("qq");//UnsupportedOperationException
//sop(list);
//int[] nums = {2,4,5};
Integer[] nums = {2,4,5};
Listli = Arrays.asList(nums);
/*
, ,
。 ,
。
*/
sop(li);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
/*
Collection toArray
*/
import java.util.*;
class CollectionToArray
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("abc1");
al.add("abc2");
al.add("abc3");
/*
1、 ?
(1) size,
, size;
(2) size, ,
, 。
2、 ?
。 。
*/
String[] arr = al.toArray(new String[al.size()]);
sop(Arrays.toString(arr));
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
詳細forループ
フォーマット:for(データタイプ変数名:巡回された集合または配列){
}セットを巡回すると、セット内の要素しか得られませんが、セットを操作することはできません.
ディケンサは巡回する以外、removeの集合の中の元素の動作を行うことができます.もしListIteratorを使うならば、巡回中に集合を添削して調べることもできます.
伝統forと高級forの違いは何ですか?
高級forには限界があります.遍歴された目標が必要です.行列を遍歴する時、伝統forを使用したいです.伝統forは角標を定義することができます.
/*
JDK1.5
:
*/
class ParamMethodDemo
{
public static void main(String[] args)
{
/*
int[] arr = {3,4};
show(arr);
int[] arr1 = {2,3,4,5};
show(arr1);
*/
//
// , 。
show(2,4,5,6);
/*
,
*/
}
public static void show(int... arr)
{
System.out.println(arr.length);
}
}
/*
StaticImport
,
,
*/
import java.util.*;
import static java.util.Arrays.*;// Arrays
import static java.lang.System.*;// System
class StaticImport extends Object
{
public static void main(String[] args)
{
out.println("haha");
int[] arr = {3,1,5};
sort(arr);
int index = binarySearch(arr,1);
System.out.println(Arrays.toString(arr));
System.out.println("Index="+index);
}
}