Java 菜鳥教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java TreeMap

在本教程中,我們將借助示例學(xué)習(xí)Java TreeMap類及其操作。

Java 集合框架的TreeMap類提供了樹形數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

它繼承了NavigableMap接口

Java TreeMap類實(shí)現(xiàn)Map接口。

創(chuàng)建一個(gè)TreeMap

為了創(chuàng)建TreeMap,我們必須首先導(dǎo)入java.util.TreeMap包。 導(dǎo)入程序包后,可以使用以下方法在Java中創(chuàng)建TreeMap。

TreeMap<Key, Value> numbers = new TreeMap<>();

在上面的代碼中,我們創(chuàng)建了一個(gè)沒有任何參數(shù)的名為numbers的TreeMap。在本示例中,TreeMap中的元素是自然排序的(升序)。

但是,我們可以通過使用Comparator接口自定義元素的排序。我們將在本教程的后面部分中學(xué)習(xí)它。

這里,

  • Key - 用于關(guān)聯(lián)map中每個(gè)元素(值)的唯一標(biāo)識(shí)符

  • Value - map中與鍵相關(guān)聯(lián)的元素

TreeMap的方法

TreeMap類提供了各種方法,允許我們對映射執(zhí)行操作。

將元素插入TreeMap

  • put() - 將指定的鍵/值映射(條目)插入到映射中

  • putAll() - 將指定映射中的所有條目插入到此映射中

  • putIfAbsent() - 如果映射中不存在指定的鍵,則將指定的鍵/值映射插入到map中

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {
        //創(chuàng)建偶數(shù)的TreeMap
        TreeMap<String, Integer> evenNumbers = new TreeMap<>();

        // 使用 put()
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);

        // 使用 putIfAbsent()
        evenNumbers.putIfAbsent("Six", 6);
        System.out.println("偶數(shù)的TreeMap: " + evenNumbers);

        //Creating TreeMap of numbers
        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("One", 1);

        // 使用 putAll()
        numbers.putAll(evenNumbers);
        System.out.println("TreeMap 的數(shù)字: " + numbers);
    }
}

輸出結(jié)果

偶數(shù)的TreeMap: {Four=4, Six=6, Two=2}
TreeMap 的數(shù)字: {Four=4, One=1, Six=6, Two=2}

訪問TreeMap元素

1.使用entrySet(),keySet()和values()

  • entrySet() - 返回TreeMap的所有鍵/值映射(條目)的集合

  • keySet() - 返回TreeMap的所有鍵的集合

  • values() - 返回TreeMap的所有圖的集合

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {
        TreeMap<String, Integer> numbers = new TreeMap<>();

        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("TreeMap: " + numbers);

        // 使用 entrySet()
        System.out.println("Key/Value 映射: " + numbers.entrySet());

        // 使用 keySet()
        System.out.println("Keys: " + numbers.keySet());

        // 使用 values()
        System.out.println("Values: " + numbers.values());
    }
}

輸出結(jié)果

TreeMap: {One=1, Three=3, Two=2}
Key/Value 映射: [One=1, Three=3, Two=2]
Keys: [One, Three, Two]
Values: [1, 3, 2]

2.使用get() 和 getOrDefault()

  • get() - 返回與指定鍵關(guān)聯(lián)的值。如果找不到鍵,則返回null。

  • getOrDefault() - 返回與指定鍵關(guān)聯(lián)的值。如果找不到鍵,則返回指定的默認(rèn)值。

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {

        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("TreeMap: " + numbers);

        // 使用 get()
        int value1 = numbers.get("Three");
        System.out.println("使用 get(): " + value1);

        // 使用 getOrDefault()
        int value2 = numbers.getOrDefault("Five", 5);
        System.out.println("使用 getOrDefault(): " + value2);
    }
}

輸出結(jié)果

TreeMap: {One=1, Three=3, Two=2}
使用 get(): 3
使用 getOrDefault(): 5

在這里,getOrDefault()方法沒有找到鍵Five。因此,它返回指定的默認(rèn)值5。

刪除TeeMap元素

  • remove(key) - 返回并從TreeMap中刪除與指定鍵關(guān)聯(lián)的條目

  • remove(key, value) -僅當(dāng)指定鍵與指定值相關(guān)聯(lián)時(shí)才從映射中刪除條目,并返回布爾值

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {

        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("TreeMap: " + numbers);

        //具有單參數(shù)刪除方法
        int value = numbers.remove("Two");
        System.out.println("被刪除的值: " + value);

        //具有兩個(gè)參數(shù)的刪除方法
        boolean result = numbers.remove("Three", 3);
        System.out.println("條目 {Three=3} 被刪除? " + result);

        System.out.println("更新后的TreeMap: " + numbers);
    }
}

輸出結(jié)果

TreeMap: {One=1, Three=3, Two=2}
被刪除的值 = 2
條目 {Three=3} 被刪除? True
更新后的TreeMap: {One=1}

替換TreeMap元素

  • replace(key, value)-用key新的替換指定映射的值value

  • replace(key, old, new) -僅當(dāng)舊值已與指定鍵關(guān)聯(lián)時(shí),才用新值替換舊值

  • replaceAll(function) -用指定的結(jié)果替換map的每個(gè)值 function

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {

        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 2);
        numbers.put("Third", 3);
        System.out.println("Original TreeMap: " + numbers);

        // 使用 replace()
        numbers.replace("Second", 22);
        numbers.replace("Third", 3, 33);
        System.out.println("TreeMap使用replace()方法: " + numbers);

        // 使用 replaceAll()
        numbers.replaceAll((key, oldValue) -> oldValue + 2);
        System.out.println("TreeMap使用replaceAll()方法: " + numbers);
    }
}

輸出結(jié)果

Original TreeMap: {First=1, Second=2, Third=3}
TreeMap使用replace()方法: {First=1, Second=22, Third=33}
TreeMap使用replaceAll()方法: {First=3, Second=24, Third=35}

在上述程序中,注意語句

numbers.replaceAll((key, oldValue) -> oldValue + 2);

在這里,我們傳遞了一個(gè)lambda表達(dá)式作為參數(shù)。

replaceAll()方法訪問map的所有條目。然后,它將所有元素替換為新值(從lambda表達(dá)式返回)。

因?yàn)門reeMap類實(shí)現(xiàn)了NavigableMap,所以它提供了在TreeMap元素上導(dǎo)航的各種方法。

1.第一個(gè)和最后一個(gè)方法

  • firstKey() - 返回map的第一個(gè)鍵

  • firstEntry() - 返回映射的第一個(gè)鍵的鍵/值映射

  • lastKey() - 返回map的最后一個(gè)鍵

  • lastEntry() - 返回映射的最后一個(gè)鍵的鍵/值映射

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {
        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 2);
        numbers.put("Third", 3);
        System.out.println("TreeMap: " + numbers);

        // 使用 the firstKey() 方法
        String firstKey = numbers.firstKey();
        System.out.println("第一個(gè)鍵: " + firstKey);

        // 使用 the lastKey() 方法
        String lastKey = numbers.lastKey();
        System.out.println("最后一個(gè)鍵: " + lastKey);

        // 使用 firstEntry() 方法
        System.out.println("第一項(xiàng): " + numbers.firstEntry());


        // 使用 the lastEntry() 方法
        System.out.println("最后一項(xiàng): " + numbers.lastEntry());
    }
}

輸出結(jié)果

TreeMap: {First=1, Second=2, Third=3}
第一個(gè)鍵: First
最后一個(gè)鍵: Third
第一項(xiàng): First=1
最后一項(xiàng): Third=3

2.向上,向下,上下限方法

  • HigherKey() - 返回大于指定鍵的那些鍵中的最小的鍵。

  • HigherEntry() - 返回與所有大于指定鍵的鍵中最小的鍵相關(guān)的條目。

  • lowerKey() - 返回所有小于指定鍵的最大鍵。

  • lowerEntry() - 返回與所有小于指定鍵的鍵中最大的鍵關(guān)聯(lián)的條目。

  • ceilingKey() - 返回大于指定鍵的那些鍵中的最小的鍵。如果映射中存在作為參數(shù)傳遞的鍵,則它將返回該鍵。

  • ceilingEntry() - 返回與大于指定鍵的那些鍵中最小的鍵相關(guān)的條目。如果映射中存在與傳遞給自變量的鍵關(guān)聯(lián)的條目,則返回與該鍵關(guān)聯(lián)的條目。

  • floorKey() - 返回小于指定鍵的那些鍵中最大的鍵。如果存在作為參數(shù)傳遞的鍵,它將返回該鍵。

  • floorEntry() - 返回與小于指定鍵的那些鍵中最大的鍵相關(guān)的條目。如果存在作為參數(shù)傳遞的鍵,它將返回該鍵。

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {

        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 5);
        numbers.put("Third", 4);
        numbers.put("Fourth", 6);
        System.out.println("TreeMap: " + numbers);

        // 使用 higher()
        System.out.println("使用 higherKey(): " + numbers.higherKey("Fourth"));
        System.out.println("使用 higherEntry(): " + numbers.higherEntry("Fourth"));

        // 使用 lower()
        System.out.println("\n使用 lowerKey(): " + numbers.lowerKey("Fourth"));
        System.out.println("使用 lowerEntry(): " + numbers.lowerEntry("Fourth"));

        // 使用 ceiling()
        System.out.println("\n使用 ceilingKey(): " + numbers.ceilingKey("Fourth"));
        System.out.println("使用 ceilingEntry(): " + numbers.ceilingEntry("Fourth"));

        // 使用 floor()
        System.out.println("\n使用 floorKey(): " + numbers.floorKey("Fourth"));
        System.out.println("使用 floorEntry(): " + numbers.floorEntry("Fourth"));


    }
}

輸出結(jié)果

TreeMap: {First=1, Fourth=6, Second=5, Third=4}
使用 higherKey(): Second
使用 higherEntry(): Second=5

使用 lowerKey(): First
使用 lowerEntry(): First=1

使用 ceilingKey(): Fourth
使用 ceilingEntry(): Fourth=6

使用 floorkey(): Fourth
使用 floorEntry(): Fourth=6

3. pollFirstEntry()和pollLastEntry()方法

  • pollFirstEntry() - 返回并刪除與映射的第一個(gè)鍵關(guān)聯(lián)的條目

  • pollLastEntry()  -返回并刪除與映射的最后一個(gè)鍵關(guān)聯(lián)的條目

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {

        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 2);
        numbers.put("Third", 3);
        System.out.println("TreeMap: " + numbers);

        //使用 the pollFirstEntry() 方法
        System.out.println("使用 pollFirstEntry(): " + numbers.pollFirstEntry());

        // 使用 the pollLastEntry() 方法
        System.out.println("使用 pollLastEntry(): " + numbers.pollLastEntry());

        System.out.println("更新后的TreeMap: " + numbers);

    }
}

輸出結(jié)果

TreeMap: {First=1, Second=2, Third=3}
使用 pollFirstEntry(): First=1
使用 pollLastEntry(): Third=3
更新后的TreeMap: {Second=2}

4. headMap(),tailMap()和subMap()方法

headMap(key,booleanValue)

headMap()方法返回指定鍵Key(作為參數(shù)傳遞)之前treemap的所有鍵/值對。

booleanValue參數(shù)是可選的。默認(rèn)值為false。

如果booleanValue為true,則該方法還包括指定key的鍵/值對。

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {

        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 2);
        numbers.put("Third", 3);
        numbers.put("Fourth", 4);
        System.out.println("TreeMap: " + numbers);

        System.out.println("\n使用 headMap() 方法:");
        // headMap() 使用默認(rèn) booleanValue為false
        System.out.println("沒有指定布爾值: " + numbers.headMap("Fourth"));

        // headMap()使用指定 booleanValue 為 true
        System.out.println("指定布爾值為true: " + numbers.headMap("Fourth", true));

    }
}

輸出結(jié)果

TreeMap: {First=1, Fourth=4, Second=2, Third=3}

使用 headMap() 方法: 
沒有指定布爾值: {First=1}
指定布爾值為true: {First=1, Fourth=4}

tailMap(key,booleanValue)

tailMap()方法從指定鍵(作為參數(shù)傳遞)開始返回樹圖的所有鍵/值對。

booleanValue是一個(gè)可選的參數(shù)。默認(rèn)值為true。

如果booleanValue為false,則該方法不包含指定key的鍵/值對。

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {

        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 2);
        numbers.put("Third", 3);
        numbers.put("Fourth", 4);
        System.out.println("TreeMap: " + numbers);

        System.out.println("\n使用 tailMap() 方法:");
        // tailMap() booleanValue使用默認(rèn)值true
        System.out.println("booleanValue使用默認(rèn)true: " + numbers.tailMap("Second"));

        // tailMap() booleanValue 使用指定值false
        System.out.println("booleanValue使用指定false : " + numbers.tailMap("Second", false));

    }
}

輸出結(jié)果

TreeMap: {First=1, Fourth=4, Second=2, Third=3}

使用 tailMap() 方法:
booleanValue使用默認(rèn)true: {Second=2, Third=3}
booleanValue使用指定false: {Third=3}

subMap(k1,bV1,k2,bV2)

subMap()方法返回與k1和k2之間的鍵相關(guān)聯(lián)的所有條目,包括k1的條目。

bV1和bV2是可選的布爾參數(shù)。  bV1的默認(rèn)值為true,bV2的默認(rèn)值為false。

如果bV1為false,則該方法返回與k1和k2之間的鍵關(guān)聯(lián)的所有條目,但不包括k1的條目。

如果bV2為true,則該方法返回與k1和k2之間的鍵關(guān)聯(lián)的所有條目,包括k2的條目。

例如,

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {

        TreeMap<String, Integer> numbers = new TreeMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 2);
        numbers.put("Third", 3);
        numbers.put("Fourth", 4);
        System.out.println("TreeMap: " + numbers);

        System.out.println("\n使用 subMap() 方法:");
        // tailMap() 使用默認(rèn)布爾值
        System.out.println("使用默認(rèn)布爾值: " + numbers.subMap("Fourth", "Third"));

        // tailMap() 指定布爾值
        System.out.println("指定布爾值: " + numbers.subMap("Fourth", false, "Third", true));

    }
}

輸出結(jié)果

TreeMap: {First=1, Fourth=2, Second=2, Third=3}

使用 subMap() 方法:
使用默認(rèn)布爾值: {Fourth=4, Second=2}
指定布爾值: {Second=2, Third=3}

TreeMap的其他方法

方法描述
clone()創(chuàng)建TreeMap副本
containsKey()搜索TreeMap指定的鍵,并返回布爾結(jié)果
containsValue()在TreeMap中搜索指定的值并返回布爾結(jié)果
size()返回的大小 TreeMap
clear()從中刪除所有條目 TreeMap

TreeMap 比較器

在以上所有示例中,treemap元素都自然排序(以升序排列)。但是,我們也可以自定義鍵的順序。

為此,我們需要基于對樹圖中的鍵進(jìn)行排序的方式來創(chuàng)建自己的比較器類。例如,

import java.util.TreeMap;
import java.util.Comparator;

class Main {
    public static void main(String[] args) {

        //使用自定義比較器創(chuàng)建treemap
        TreeMap<String, Integer> numbers = new TreeMap<>(new CustomComparator());

        numbers.put("First", 1);
        numbers.put("Second", 2);
        numbers.put("Third", 3);
        numbers.put("Fourth", 4);
        System.out.println("TreeMap: " + numbers);
    }

    //創(chuàng)建一個(gè)比較器類
    public static class CustomComparator implements Comparator<String> {

        @Override
        public int compare(String number1, String number2) {
            int value =  number1.compareTo(number2);

            //元素以相反的順序排序
            if (value > 0) {
                return -1;
            }
            else if (value < 0) {
                return 1;
            }
            else {
                return 0;
            }
        }
    }
}

輸出結(jié)果

TreeMap: {Third=3, Second=2, Fourth=4, First=1}

在上面的示例中,我們創(chuàng)建了一個(gè)treemap,將CustomComparator類作為參數(shù)傳遞。

CustomComparator類實(shí)現(xiàn)了Comparator接口。

然后重寫compare()方法,以相反順序排列元素。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清