- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
public class LinkedHashMap extends HashMap implements Map
1、 Map接口的哈希表和链接列表实现,具有可预知的迭代顺序;
2、 不是同步的,fail-fast;
3、 允许nullkeyorvalue;
4、 继承HashMap,LinkedHashMap保证Map有序(插入顺序、访问顺序);
成员变量
/**
* 双重链接列表头节点
*/
private transient Entry<K,V> header;
/**
* 该linked hash map的排序方式
* 排序模式 - 对于访问顺序,为 true;对于插入顺序,则为 false
*/
private final boolean accessOrder;
LinkedHashMap重新定义了内部类Entry,实现双向链表。
/**
* LinkedHashMap entry.
*/
private static class Entry<K,V> extends HashMap.Entry<K,V> {
//用于实现双向链表
Entry<K,V> before, after;
}
构造方法
public LinkedHashMap(int initialCapacity,
float loadFactor, boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
有源码看出,LinkedHashMap构造方法调用父类HashMap构造方法,再调用LinkedHashMap覆写的init方法,从而实现双重链表初始化。
void init() {
header = new Entry<K,V>(-1, null, null, null);
header.before = header.after = header;
}
put方法
LinkedHashMap并未重写HashMap.put方法。而是重写了父类HashMap.put方法中void addEntry(int hash, K key, V value, int bucketIndex) 和void createEntry(int hash, K key, V value, int bucketIndex),提供了双重链表的实现。
void addEntry(int hash, K key, V value, int bucketIndex) {
createEntry(hash, key, value, bucketIndex);
Entry<K,V> eldest = header.after;
if (removeEldestEntry(eldest)) {
removeEntryForKey(eldest.key);
} else {
if (size >= threshold)
resize(2 * table.length);
}
}
void createEntry(int hash, K key, V value, int bucketIndex) {
HashMap.Entry<K,V> old = table[bucketIndex];
Entry<K,V> e = new Entry<K,V>(hash, key, value, old);
table[bucketIndex] = e;
e.addBefore(header);
size++;
}
get方法
LinkedHashMap覆写了父类的get方法,区别在于,査找到对应元素后,若accessOrder为true时,更新访问顺序,即将最新访问元素移到链表头部,并,即LRU算法思想,可用做LRU缓存。accessOrder为false时,因其迭代顺序即为默认插入顺序,故不用做额外变动。
注意accessOrder为true时:迭代顺序为从近期访问最少到近期访问最多的顺序。
例如key插入顺序:1,2,3。get(2)之后,map迭代顺序顺序为:1,3,2。
public V get(Object key) {
//调用父类HashMap.getEntry方法,获取对应entry
Entry<K,V> e = (Entry<K,V>)getEntry(key);
if (e == null)
return null;
e.recordAccess(this);
return e.value;//返回值
}
void recordAccess(HashMap<K,V> m) {
LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
if (lm.accessOrder) {//访问模式,更新访问顺序,LRU
lm.modCount++;
remove();
addBefore(lm.header);
}
}
LinkedHashMap继承HashMap,拥有其特性,重新定义Entry从而增加了双重链表特性。提供两种排序方式:访问顺序、插入顺序。
public interface SortedMap extends Map
1、 进一步提供关于键的总体排序的Map;
2、 键的自然排序可由Comparable或Comparator方式实现;
public interface NavigableMap extends SortedMap
1、 扩展的SortedMap,具有了针对给定搜索目标返回最接近匹配项的导航方法;
2、 可以按照键的升序或降序访问和遍历NavigableMap;
public class TreeMap extends AbstractMap implements NavigableMap, Cloneable, java.io.Serializable
1、 基于红黑树(Red-Blacktree)的NavigableMap实现;
2、 该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法;
3、 不是同步的,fail-fast;
成员变量
/**
* 自然排序比较器
*/
private final Comparator<? super K> comparator;
//根节点
private transient Entry<K,V> root = null;
/**
* key-value 映射对数
*/
private transient int size = 0;
/**
* 树的修改次数
*/
private transient int modCount = 0;
构造方法
/**
* 使用键的自然顺序构造一个新的、空的树映射。
*/
public TreeMap() {
comparator = null;
}
/**
* 构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。
*/
public TreeMap(SortedMap<K, ? extends V> m) {
comparator = m.comparator();
try {
buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
} catch (java.io.IOException cannotHappen) {
} catch (ClassNotFoundException cannotHappen) {
}
}
百度百科解释红黑树:
1、 红黑树(RedBlackTree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组;
2、 红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能;
3、 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目;
TreeMap基于红黑树,Map有序,适用于查找搜索场景。
我是 Scala 新手。我想在 Scala 中创建一个包含两个可变 SortedMap 的类,一个按正常排序顺序(递增),一个按反向排序顺序(递减) class MyClass { var map
我有一个无序的 map : class O(val a: Int) Map[String, List[O]] 我想变成: SortedMap[String, SortedMap[Int, O]] 子
我是 Scala 的新手。 我正在使用 SortedMap在我的代码中,我想使用 mapValues 创建一个对值进行一些转换的新 map 。 而不是返回一个新的 SortedMap ,mapValu
给定一个 key k在 SortedMap 中,如何有效地找到最大的键 m小于或等于 k ,也是最小的键 n大于或等于 k .谢谢你。 最佳答案 查看 2.9.0 的源代码,下面的代码似乎是你能做的最
我想实现一个带有键和值的 sortedMap,以便可以通过提供一些子序列来搜索键。例如, map 包含 3 个条目: abcd -> obj1 def -> obj2 abccd -> obj3 对于
我确信这很简单,但出于某种原因我没有得到我想要的。 我有一个 SortedMap值,我想流式传输和过滤它并仅保存一些值。 例如: SortedMap input = new TreeMap<>
我有一个 SortedMap> .其中每个字符串都是一个带有可能答案和附加点的问题。 我如何使用这个 Map按位置打印问题(第一个,第二个,...) sampleArray[0] ? 最佳答案 遍历
可以使用 myMap.entrySet().iterator() 中的迭代器遍历 SortedMap。但是这个迭代器是否保留了已排序映射对象的顺序? SortedMap 接口(interface)没有
我需要一个有序映射,每个键都包含这些字段[srcAddr, dstAddr, srcPort, dstPort, protocol](这个对应一个流) 那么这个键包含一个值列表,每个值包含一些字段。例
我有以下方法在 map 中映射值: public static Map transformValues(Map input, Function function) { return inpu
我想要一个排序的映射如下: srcAddr, dstAddr, srcPort, dstPort, protocol as keys 和列表的值作为 每个键的 packetLength、timeArr
这就是我面临的问题,我正在尝试使用 Id 作为键并使用对象指针作为值来实现 HashMap。 在每个对象中,有几个整数,假设它们代表对象中定义的各种类别的投资金额。 但是,我希望能够对特定类别中的投资
我必须实现方法 maxPricePerProductType 返回产品类型的最高出价,产品按字母顺序排序。没有出价的产品不予考虑。方法原型(prototype)为: public SortedMap
正如我们所知,SortedMap 维护按键排序的条目。我在这个论坛上阅读了很多主题,看到了很多按值对 SortedMap 进行排序的示例。但是,正如您所知,当我将一个项目放入默认 SortedMap
我有一个 SortedMap (实现是一个 TreeMap ),看起来像这样: [ProjectOne] -> [ActivityOne,ActivityTwo,ActivityThree] [Pro
我有一个 SortedMap(特别是 TreeMap),我从中提取值。稍后,我需要获取第一个和最后一个值,因为它们在 SortedMap 中排序。 SortedMap.values() 返回一个 Co
我是 Java 的新手,正在学习集合。作为练习,我正在尝试使用自定义比较器对 SortedMap 进行排序。我希望能够按平均成绩降序对学生 SortedMap 进行排序。 SortedMap stu
我有一个 SortedMap>我想删除 List如果List是空的,我也会删除 Long键。 在 Java 8 中是否有一个优雅的解决方案? 通过这段代码,我得到一个 ConcurrentModifi
我在 Java 中工作并且有一个 SortedMap,它是作为 ConcurrentSkipListMap 实现的。我需要从 SortedMap 的头部删除一些项目——即所有键小于某个阈值的项目。实际
我想知道有什么更好的方法可以在大型 SortedMap 中找到大于输入值的第一个值,而不是在下面的示例中循环遍历所有值。或者如果 SortedMap 是用于此的最佳结构。 这可以使用 google-c
我是一名优秀的程序员,十分优秀!