1. 程式人生 > >創建一個自定義比較器

創建一個自定義比較器

rac void ger 接口 table string pre ride com

雙列集合:

-------------| Map 如果是實現了Map接口的集合類,具備的特點: 存儲的數據都是以鍵值對的形式存在的,鍵不可重復,值可以重復。

----------------| HashMap 底層也是基於哈希表實現 的。

HashMap的存儲原理:

往HashMap添加元素的時候,首先會調用鍵的hashCode方法得到元素 的哈希碼值,然後經過運算就可以算出該

元素在哈希表中的存儲位置。

情況1: 如果算出的位置目前沒有任何元素存儲,那麽該元素可以直接添加到哈希表中。

情況2:如果算出 的位置目前已經存在其他的元素,那麽還會調用該元素的equals方法與這個位置上的元素進行比較

,如果equals方法返回 的是false,那麽該元素允許被存儲,如果equals方法返回的是true,那麽該元素被視為

重復元素,不允存儲。

----------------| TreeMap TreeMap也是基於紅黑樹(二叉樹)數據結構實現 的, 特點:會對元素的鍵進行排序存儲。

TreeMap 要註意的事項:

1. 往TreeMap添加元素的時候,如果元素的鍵具備自然順序,那麽就會按照鍵的自然順序特性進行排序存儲。

2. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性, 那麽鍵所屬的類必須要實現Comparable接口,把鍵

的比較規則定義在CompareTo方法上。

3. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性,而且鍵所屬的類也沒有實現Comparable接口,那麽就必須

在創建TreeMap對象的時候傳入比較器。

class Emp {//implements Comparable<Emp>{
    String name;
    int salary;
    public Emp(String name, int salary) {
        super();
        this.name = name;
        this.salary = salary;
    }
    @Override
    
public String toString() { return "[姓名:"+this.name+" 薪水:"+ this.salary+"]"; } /* @Override public int compareTo(Emp o) { return this.salary - o.salary; }*/ } //自定義一個比較器 class MyComparator implements Comparator<Emp>{ @Override public int compare(Emp o1, Emp o2) { return o1.salary - o2.salary; } } public class Demo6 { public static void main(String[] args) { /* TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>(); tree.put(‘c‘,10); tree.put(‘b‘,2); tree.put(‘a‘,5); tree.put(‘h‘,12); System.out.println(tree);*/ //創建一個自定義比較器 MyComparator comparator = new MyComparator(); TreeMap<Emp, String> tree = new TreeMap<Emp, String>(comparator); tree.put(new Emp("冰冰", 2000),"001"); tree.put(new Emp("家寶", 1000),"002"); tree.put(new Emp("習總", 3000),"003"); tree.put(new Emp("克強", 5000),"005"); tree.put(new Emp("財厚", 5000),"008"); System.out.println(tree); } }

雙列集合:-------------| Map 如果是實現了Map接口的集合類,具備的特點: 存儲的數據都是以鍵值對的形式存在的,鍵不可重復,值可以重復。----------------| HashMap 底層也是基於哈希表實現 的。HashMap的存儲原理:往HashMap添加元素的時候,首先會調用鍵的hashCode方法得到元素 的哈希碼值,然後經過運算就可以算出該元素在哈希表中的存儲位置。 情況1: 如果算出的位置目前沒有任何元素存儲,那麽該元素可以直接添加到哈希表中。情況2:如果算出 的位置目前已經存在其他的元素,那麽還會調用該元素的equals方法與這個位置上的元素進行比較,如果equals方法返回 的是false,那麽該元素允許被存儲,如果equals方法返回的是true,那麽該元素被視為重復元素,不允存儲。
----------------| TreeMap TreeMap也是基於紅黑樹(二叉樹)數據結構實現 的, 特點:會對元素的鍵進行排序存儲。
TreeMap 要註意的事項:1. 往TreeMap添加元素的時候,如果元素的鍵具備自然順序,那麽就會按照鍵的自然順序特性進行排序存儲。2. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性, 那麽鍵所屬的類必須要實現Comparable接口,把鍵的比較規則定義在CompareTo方法上。3. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性,而且鍵所屬的類也沒有實現Comparable接口,那麽就必須在創建TreeMap對象的時候傳入比較器。
----------------| Hashtable */class Emp {//implements Comparable<Emp>{String name;int salary;public Emp(String name, int salary) {super();this.name = name;this.salary = salary;}@Overridepublic String toString() {return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";}
/*@Overridepublic int compareTo(Emp o) {return this.salary - o.salary;}*/}

//自定義一個比較器class MyComparator implements Comparator<Emp>{@Overridepublic int compare(Emp o1, Emp o2) {return o1.salary - o2.salary;}}
public class Demo6 {public static void main(String[] args) {/*TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>();tree.put(‘c‘,10);tree.put(‘b‘,2);tree.put(‘a‘,5);tree.put(‘h‘,12);System.out.println(tree);*///創建一個自定義比較器MyComparator comparator = new MyComparator();TreeMap<Emp, String> tree = new TreeMap<Emp, String>(comparator);tree.put(new Emp("冰冰", 2000),"001");tree.put(new Emp("家寶", 1000),"002");tree.put(new Emp("習總", 3000),"003");tree.put(new Emp("克強", 5000),"005");tree.put(new Emp("財厚", 5000),"008");System.out.println(tree);}
}

創建一個自定義比較器