结构为键值的map_在Java中增加Map值的最有效方法-只需搜索键一次

结构为键值的map

这个问题可能被认为太基础了,但是在论坛中经常被问到。 在本文中,我将讨论一种仅在Map ONCE中搜索键的方法。

让我们首先来看一个例子。 假设我正在使用Map创建一个字符串频率列表,其中每个键是一个正在计数的String ,值是一个Integer ,每次添加一个String都会递增。 实现它的一种直接方法是

int count = map.containsKey(string) ? map.get(string) : 0;
map.put(string, count + 1);

这段代码运行很慢,因为它在地图上包含三个潜在的昂贵操作,即containsKey()get()[put()](http://docs.oracle.com/javase/7/docs/ api / java / util / Map.html#put(K,V)) 。 每个都需要在地图中搜索关键字。 现在,让我们重构代码以获得更好的性能。

整数与MutableInteger与AtomicInteger

我们必须调用三个昂贵的操作的重要原因之一是使用Integer进行计数。 在Java中, Integer不可变的 。 这样可以防止我们在构造后修改整数值。 因此,要增加一个计数器,我们必须首先从映射中获取整数,然后通过添加一个整数来创建另一个新整数,然后将其放回映射中。

为了使计数器可变,有几种方法。 一种是简单地创建自己的MutableInteger ,就像我在下面显示的那样。

public class MutableInteger {private int val;public MutableInteger(int val) {this.val = val;}public int get() {return val;}public void set(int val) {this.val = val;}
}

另一种方法可能是在Java中使用AtomicInteger ,该方法用于原子增量计数器等应用程序中。 但是AtomicInteger的主要选择是如果您希望通过对整数进行操作来实现线程安全。 因此,它不能用作Integer的替代。 基于此,如果线程安全不是您项目的重要考虑因素,则我不建议您使用AtomicInteger

仅搜索一次密钥

使用MutableInteger之后 ,我们可以将上面的代码更改为

if (map.containsKey(string)) {MutableInteger count = map.get(string);count.set(count.get() + 1);
} else {map.put(string, new MutableInteger(1));
}

要么

MutableInteger count = map.get(string);
if (count != null) {count.set(count.get() + 1);
} else {map.put(string, new MutableInteger(1));
}

在最坏的情况下,如果之前没有看到密钥,则代码将搜索密钥两次:一次用于检索,一次用于设置。 它比上一个要好得多。 但是我们不应该立即满足并停止。 如果您在Java文档中选中了[Map.put()](http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#put(K,V))方法,您会发现此方法将返回the previous value associated with key 。 这意味着我们可以将检索和设置合并为一个。 但是,您可能想知道:如果不首先检索计数器,如何设置新计数器? 现在,我们终于可以触摸本文中最棘手的部分:我们可以简化一下零频率计数器的放置!

public int incrementCount(K key, int count) {MutableInteger tmpCount = new MutableInteger(0);MutableInteger oldCount = map.put(key, tmpCount);if (oldCount != null) {count += oldCount.get();}tmpCount.set(count);return count;}

另一个柜台

看起来将所有必要的操作放入一个类中将对将来的使用有所帮助。 因此,我创建了一个名为Counter的类并将其公开。 计数器定义一个集合,该集合对对象出现在集合中的次数进行计数。 假设您有一个包含{a, a, b, c}的Counter。 在“ a”上调用getCount()将返回2,而在keySet()上调用将返回{a, b, c} 。 此类的工作方式类似于Map ,但具有不同的方法,可以轻松获取/设置/增加对象的计数并使用该计数计算各种函数。 Counter构造函数和addAll()方法可用于复制另一个Counter的内容。 根据IntCounterAbstractMapBag修改Counter类。

Counter上的一些突出操作包括

  • crementCount()decrementCount() :将给定键的给定计数与当前计数相加/相减。 如果该键以前未出现过,则假定其计数为0,因此增量方法会将其计数设置为给定的数量。 减量会将其计数设置为-1。
  • getCount() :返回给定键的当前计数,如果以前没有看到过,则返回0。
  • keysAt()keysAbove()keysBelow() :返回其计数在给定阈值之上,之下或之下的一组键。 该集合可能包含0个元素,但不会为null。
  • argmin ()argmax() :找到并返回此Counter中具有最小/最大计数的密钥。 如果有几个最小/最大计数,则返回随机值。 如果此Counter为空,则返回null。

参考: 用Java递增Map值的最有效方法–只需从PGuru博客的JCG合作伙伴 Peng Yifan那里 搜索一次密钥 。

翻译自: https://www.javacodegeeks.com/2013/10/most-efficient-way-to-increment-a-map-value-in-java-only-search-the-key-once.html

结构为键值的map

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数字信号处理】基于DFT的滤波系列5之二维DFT滤波(含MATLAB代码)

五、二维DFT滤波 前几节介绍的用于对时间序列滤波的原理也可用于对图像的滤波,采用二维傅里叶变换技术。 下图为一幅图像的二维DFT(2D DFT)变换后的幅度值,该图像仅由一个恒定强度组成,因此它是0Hz分量——背景强度。在可视化 2D DFT 的结果时通常使用fftshift(),因此 DC…

Vaadin教程

1.简介 当您是后端开发人员时,您会听到人们说您无法创建内置HTML的UI页面并且无法使用CSS设置样式时所引起的痛苦。 就像成为后端开发人员一样,它具有已知的局限性,即我们可以播放和运行大型生产后端应用程序,但不能创建漂亮的页面…

【定时同步系列5】Farrow内插器结构原理和MATLAB实现

引言 通常我们接收到的信号是过采样的 x ( m T s ) x(mT_s) x(mT

【数字信号处理】基于DFT的滤波系列6之维纳滤波理论推导与MATLAB仿真

维纳(Wiener)滤波 引言 罗伯特维纳(Norbert Wiener)是一位对信号处理理论做出重大贡献的神童。维纳滤波是其中之一,维纳-辛钦(Wiener-Khinchin)定理是另一个表明信号的功率谱密度是其自相关函数的傅里叶变换的定理。他也是控制论的“鼻祖”。 我们将看一下维纳滤波器的一个…

jee web_您基于JEE的Web项目的结构是什么?

jee web在这篇文章中,我将尝试讨论基于Web的项目的各种组织结构,主要是使用JSF。 开始新项目时,首先想到的是如何组织Java包? 想象一下,您开发了一个基于Web的用户和组管理系统。 很长时间以来,我使用了以下…

【数字信号处理】希尔伯特变换系列1之相位处理(含MATLAB代码)

利用希尔伯特变换进行相位处理 相位的频域处理 在讨论“理想DFT滤波”时,我们注意到通常信号的相位将保持不变,这意味着不会发生由非线性相位引起的失真。然而,应该总是考虑相位响应(或者至少意识到它的存在)和幅度响应。对于所有频率,应该考虑幅度和相位。那么一个明显的…

【数字信号处理】分贝dB、dBm的概念及其日常使用中常见的错误

分贝的基本概念 首先,分贝的英文为decibel,单位为dB;其中bel表示声音计量单位(单位为Bel),并且有 1 dB ⁡ = 1 / 10 Bel ⁡ 1\operatorname{dB}=1/10\operatorname{Bel} 1dB

日期使用

时区糟透了。 特别是夏令时。 我不介意像与此行为相关的编程错误那样,不停移动时钟或失去一个小时的睡眠。 更糟糕的是Java的旧日期/时间API。 Java社区通过JSR 310公开承认了这一点,该版本取代了Java Date&Time API,但是由于其复…

【数字信号处理】复数的另一种思考之平均风向测量(Python实现)

平均风向和风速测量 气象站每分钟测量一次风向。编写一个程序来指示五分钟内的平均方向。在以下几组读数上试一试:12、15、13、9、16 358、1、359、355、2 210、290、10、90、170 修改您的程序以处理风速输入以及方向。代码 import cmath from matplotlib.pylab import * tau…

开源mindmap_Java开发人员访谈的MindMap

开源mindmap多年来,我在许多Java开发人员的访谈中担任小组成员。 之前,我曾写过一篇标题为成功参加软件工程师技术面试的7大技巧的文章,其中涵盖了很少的一般准则。 在本文中,我将分享一个思维导图,其中包含Java开发人…

【数字信号处理】希尔伯特变换系列2之基于定向多普勒超声的胎儿心率监测(含MATLAB代码)

希尔伯特变换的应用 希尔伯特变换在许多工程应用中都有使用,此处主要介绍两种用法。 首先,它解决了多普勒超声胎儿心率监测器中出现的运动方向不明确的问题。第二,它与众所周知的解析信号联系起来了,在极坐标中,它能够找到信号的瞬时幅度和瞬时频率。 基于定向多普勒超…

轻松地与Java完全集成

这里介绍了如何编写完整的堆栈数据库Web应用程序,而无需使用SQL,HQL,PHP,ASP,HTML,CSS或Javascript,而是使用Vaadin的UI层和Speedment Stream ORM完全依赖Java。 是否曾经想过快速创建连接到您…

MATLAB读取结构体mat文件报错已损坏

遇到一个挺奇怪的事情,用MATLAB R2021a保存下来的.mat文件,里面是一个结构体;结果在MATLAB R2018b中load这个mat文件,提示“无法读取,改文件可能已损坏” 初步猜想可能是MATLAB版本的问题,正好虚拟机里有便…

【自适应盲均衡11】基于Volterra级数的双线性CMA盲均衡算法与MATLAB仿真(采用16QAM信号模型)

结果预览 16QAM信号的星座图: 输入信号的星座图: Volterra-CMA盲均衡算法的MSE曲线: 均衡后的星座图: 一、Volterra级数 由于多方面的原因,Volterra级数模型是非线性系统广泛采用的模型。简单起见,本文仍采用线性系统进行测试。 Volterra级数展开是由非递归级数组成…

矩形和升余弦成型下OQPSK信号的调制与解调仿真(最大功率法定时)

关注公号【逆向通信猿】更精彩!!! 仿真结果预览 OQPSK矩形和升余弦成型误码率曲线: 关于QPSK信号的仿真在之前的博客里已经 一、OQPSK调制原理 在QPSK体制中,它的相邻码元最大相位差达到180。由于这样的相位突变在频带受限的系统中会引起信号包络的很大起伏,这是不希…

java web 刷新_Java Web项目的保存和刷新

java web 刷新如何配置计算机以保存并刷新Java Web项目? 当您向开发人员提出此问题时,答案以“哦,好吧……”开头,并以某种可行的方式继续描述。 每个人都有自己的方式。 首先–为什么需要这个? 因为执行复制和重新启…

【数字信号处理】希尔伯特变换系列3之解析信号(含MATLAB代码)

希尔伯特变换&解析信号 你可能从未将DFT应用于复信号,因此你的数据将是实的,这样做的一个影响是DFT是对称的。在许多应用中,正频和负频分量都必须被处理——参见早期理想的DFT滤波,其中正频和负频分量都必须以相同的方式处理,以便滤波后的数据是实的(根据需要)。然而…

Java SE 11(18.9)中的API更新

Java SE 11也被命名为18.9(基于使用发布年份和月份的新命名方案),预计将在9月的最后一周发布GA。 频繁发布新JDK版本的新方法是允许语言创建者引入新功能,并向开发人员社区更快地进行API更新。 通常,API更新不会引起注…

【数字信号处理】卷积和乘法系列1之引言(含MATLAB代码)

引言 要了解 DSP 的许多方面,以及使用傅里叶分析 (FA) 的其他应用,以下几点很重要 了解卷积的过程要知道时间/频率域中的卷积/乘法 等价于 频域/时间域中的乘法/卷积会应用这些知识卷积是一个会引起很多混淆的过程,但使用采样数据(离散)比使用连续时间数据更容易理解。这是…

【数字信号处理】卷积和乘法系列2之AM调制、幅度谱和相位谱(含MATLAB代码)

关注公号【逆向通信猿】更精彩!!! 案例2的应用——幅度调制(AM) 能够预测卷积两个信号的结果是很有用的。一个明显的例子是 AM 调制(参见上一节 和下面的图 1),其中载波通过混合(混频)由基带信号调制。在频域中,这两个信号的频谱是卷积的。 在图1中,显示了幅度调制…