📜  Java中 TreeMap 的内部工作

📅  最后修改于: 2022-05-13 01:55:29.562000             🧑  作者: Mango

Java中 TreeMap 的内部工作

TreeMap 类就像 HashMap。 TreeMap 存储键值对。主要区别在于 TreeMap 按升序对键进行排序。 TreeMap 根据其键的顺序进行排序,或者通过在映射创建时提供的 Comparator 进行排序,具体取决于使用的构造函数。

先决条件:

在进一步讨论之前,让我们先了解一下主要包括在 TreeMap 情况下可用的构造函数的先决条件

  1. TreeMap()这个默认构造函数构造了一个空的 TreeMap
  2. TreeMap(Map map)它使用地图中的条目创建一个 TreeMap。
  3. TreeMap(Comparator compare)这是一个参数构造函数,它使用Comparator对象来构造一个空的基于树的映射。它将使用比较器比较进行排序。
  4. TreeMap(SortedMap sortedMap)它可以用来自sortedMap的条目初始化为TreeMap

插图:

Input  : a = ["Alice", 1], b = ["Bob", 2]
Output : TreeMap = {"Alice" = 1, "Bob" = 2}

Input  : a = [1, "First"], b = [2, "Second"], c = [3, "Third"]
Output : TreeMap = {1 = "First", 2 = "Second", 3 = "Third"}

概念:红黑树

红黑树是一种自平衡二叉搜索树,其中每个节点都有一个额外的位,该位通常被解释为颜色(红色或黑色)。这些颜色用于确保树在插入和删除过程中保持平衡。虽然树的平衡性并不完美,但足以减少搜索时间并保持在 O(log n) 时间左右,其中 n 是树中元素的总数。必须注意的是,由于每个节点只需要 1 位空间来存储颜色信息,这些类型的树显示出与经典(未着色)二叉搜索树相同的内存占用。

  1. 顾名思义,树中每个节点的颜色都是黑色或红色。
  2. 根节点的颜色必须是黑色。
  3. 红色节点不能有红色邻居节点。
  4. 从根节点到空节点的所有路径都应包含相同数量的黑色节点。

上述特性导致节点具有某些属性,结果如下:

  1. 左边的元素总是小于父元素。
  2. 自然排序是在对象的逻辑比较中计算的。
  3. 正确的元素总是大于或等于父元素。

语法:声明一个 TreeMap 的对象或简单地创建一个 TreeMap

Map treemap = new TreeMap<>();

方法:

  1. 创建树图。
  2. 创建一些条目以输入到 TreeMap 中。
  3. 计算 Key {“key1”} 的哈希码。它将生成为 118。
  4. 使用 for 循环遍历打印 TreeMap。

实现:实现红黑树来展示 TreeMap 的内部工作

例子

Java
// Java Program to show Internal Working
// of TreeMap in Java
 
// Importing Map and TreeMap classes
// from java.util package
import java.util.Map;
import java.util.TreeMap;
 
// Standard Comparable
public class Key implements Comparable {
 
    // Custom input
    final int data = 118;
    private String key;
 
    // Constructor of this class
    public Key(String key)
    {
        // Super keyword refers immediate parent class
        // object
        super();
 
        // This keyword is a reference variable
        // referring to current object
        this.key = key;
    }
 
    // Print Key method
    public String printKey() { return this.key; }
 
    // Override compareTo method
    @Override public int compareTo(Key obj)
    {
        return key.compareTo(obj.key);
    }
}
 
// Main Class
class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Initialize TreeMap
        // Declaring object of String type
        Map treemap = new TreeMap<>();
 
        // Adding the elements in object of TreeMap
        // Custom inputs
        treemap.put(new Key("Key1"), "Alice");
        treemap.put(new Key("Key4"), "Zeya");
        treemap.put(new Key("Key3"), "Geek");
        treemap.put(new Key("Key2"), "Bob");
 
        // Iterate over object elements using for-each loop
        for (Map.Entry entry :
             treemap.entrySet())
 
            // Print elements in TreeMap object
            System.out.println(
                "[" + entry.getKey().printKey() + " = "
                + entry.getValue() + "]");
    }
}


Java
// Java Program to show Internal Working
// of TreeMap in Java
 
// Importing Map and TreeMap classes
// from java.util package
import java.util.Map;
import java.util.TreeMap;
 
// Standard Comparable
public class Key implements Comparable {
 
    // Custom input
    final int data = 118;
    private String key;
 
    // Constructor of this class
    public Key(String key)
    {
        // Super keyword refers immediate parent class
        // object
        super();
 
        // This keyword is a reference variable
        // referring to current object
        this.key = key;
    }
 
    // Print Key method
    public String printKey() { return this.key; }
 
    // Override compareTo method
    @Override public int compareTo(Key obj)
    {
        return key.compareTo(obj.key);
    }
}
 
// Main Class
class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Initialize TreeMap
        // Declaring object of String type
        Map treemap = new TreeMap<>();
 
        // Adding the elements in object of TreeMap
        // Custom inputs
        treemap.put(new Key("Key1"), "Alice");
        treemap.put(new Key("Key4"), "Zeya");
        treemap.put(new Key("Key3"), "Geek");
        treemap.put(new Key("Key2"), "Bob");
 
        // Iterate over object elements using for-each loop
        for (Map.Entry entry :
             treemap.entrySet())
 
            // Print elements in TreeMap object
            System.out.println(
                "[" + entry.getKey().printKey() + " = "
                + entry.getValue() + "]");
    }
}


Java

// Java Program to show Internal Working
// of TreeMap in Java
 
// Importing Map and TreeMap classes
// from java.util package
import java.util.Map;
import java.util.TreeMap;
 
// Standard Comparable
public class Key implements Comparable {
 
    // Custom input
    final int data = 118;
    private String key;
 
    // Constructor of this class
    public Key(String key)
    {
        // Super keyword refers immediate parent class
        // object
        super();
 
        // This keyword is a reference variable
        // referring to current object
        this.key = key;
    }
 
    // Print Key method
    public String printKey() { return this.key; }
 
    // Override compareTo method
    @Override public int compareTo(Key obj)
    {
        return key.compareTo(obj.key);
    }
}
 
// Main Class
class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Initialize TreeMap
        // Declaring object of String type
        Map treemap = new TreeMap<>();
 
        // Adding the elements in object of TreeMap
        // Custom inputs
        treemap.put(new Key("Key1"), "Alice");
        treemap.put(new Key("Key4"), "Zeya");
        treemap.put(new Key("Key3"), "Geek");
        treemap.put(new Key("Key2"), "Bob");
 
        // Iterate over object elements using for-each loop
        for (Map.Entry entry :
             treemap.entrySet())
 
            // Print elements in TreeMap object
            System.out.println(
                "[" + entry.getKey().printKey() + " = "
                + entry.getValue() + "]");
    }
}

输出说明以图形方式表示,以便了解 TreeMap 节点的内部工作方式,以便更好地理解上述输出是如何生成的。