O(1)纬度减少循环次数

平事看淡,不服就干。老子有句粗口话不知道当不当讲,我们公司上一次发工资时4月4号,时至今日5-30已经有57天没有发工资了,我还要继续坚持下去吗?难不成现在大家工作都TM的不在乎钱了的吗?

使用O(1)纬度减少循环次数,提高代码质量。

需要实现匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:

 package com.xinyan.springcloud.tjt;

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.commons.lang.StringUtils; import lombok.Data; public class CompareOne {
private static List<KeyInfo> list1 = new ArrayList<>();
private static List<CipherPathInfo> list2 = new ArrayList<>(); /**
* 比较low的methodOne设计
*/
public void methodOne() {
// 匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:
// 设计方案1:
for (int i = 0; i < list1.size(); i++) {
KeyInfo keyInfo = list1.get(i);
String keyName = keyInfo.getKeyName();
String cipher = keyInfo.getCipher();
for (int j = 0; j < list2.size(); j++) {
CipherPathInfo cipherPathInfo = list2.get(j);
String keyName2 = cipherPathInfo.getKeyName();
if (StringUtils.equals(keyName, keyName2)) {
cipherPathInfo.setCipher(cipher);
}
}
}
} /**
* 较好的methodTwo设计
*/
public void methodTwo() {
// 匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:
// 设计方案2:
Map<String, String> keyNameMap = new HashMap<>();
// 使用keyNameMap缓存keyName的cipher
for (int i = 0; i < list1.size(); i++) {
KeyInfo keyInfo = list1.get(i);
String keyName = keyInfo.getKeyName();
String cipher = keyInfo.getCipher();
keyNameMap.put(keyName, cipher);
}
// 根据keyName的名称查keyNameMap取出cipher
for (int j = 0; j < list2.size(); j++) {
CipherPathInfo cipherPathInfo = list2.get(j);
String keyName = cipherPathInfo.getKeyName();
String cipher = keyNameMap.get(keyName);
if (StringUtils.isNotEmpty(cipher)) {
cipherPathInfo.setCipher(cipher);
}
}
} /**
* 实体KeyInfo
*
* @author apple
*/
@Data
class KeyInfo {
private String keyName;
private String cipher;
} /**
* 实体CipherPathInfo
*
* @author apple
*/
@Data
class CipherPathInfo {
private String keyName;
private String cipher;
private String path;
} /**
* 构造KeyInfo、CipherPathInfo实体信息
*/
public void makeEntityInfo() {
KeyInfo keyInfo = new KeyInfo();
// 构造30个keyInfo实体
for (int i = 0; i < 30; i++) {
keyInfo.setKeyName("name_" + i);
keyInfo.setCipher("cipher_" + i);
list1.add(keyInfo);
}
CipherPathInfo cipherPathInfo = new CipherPathInfo();
// 构造100个ciperhPathInfo实体,其中cipher为null
for (int j = 0; j < 100; j++) {
cipherPathInfo.setKeyName("name_" + j);
cipherPathInfo.setPath("path_" + j);
list2.add(cipherPathInfo);
}
} public static void main(String[] args) {
CompareOne c = new CompareOne();
c.makeEntityInfo();
// 匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:
// 设计方案1:
c.methodOne();
// 方案1设计明显不合理,很low;其中list1有30个元素,而list2有100个
// 这样就会累计循环30*100次
// 可以将讲list1中获取到的keyName插入哈希中,只需要O(1)的纬度
// 方案设计2:
c.methodTwo(); } }

O(1)纬度减少循环次数的更多相关文章

  1. 如何更规范化编写Java 代码

    如何更规范化编写Java 代码 Many of the happiest people are those who own the least. But are we really so happy ...

  2. 如何更规范化的编写JAVA 代码

    如何更规范的编写JAVA代码 一.MyBatis 不要为了多个查询条件而写 1 = 1 当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失, ...

  3. MMORPG大型游戏设计与开发(攻击区域 扇形)

    距离上次发布已经有了很长一段时间,期间由于各种原因没有更新这方面的技术分享,在这里深表遗憾.在MMO或其他的游戏中,会有针对各种形状的计算,通常在攻击区域里不会很复杂,常见的为矩形.圆形.扇形.今天分 ...

  4. 延迟求值-如何让Lo-Dash再提速x100?

    「注释」作者在本文里没有说明这么一个事实: 目前的版本Lo-Dash v2.4.1并没有引入延迟求值的特性,Lo-Dash 3.0.0-pre中部分方法进行了引入,比如filter(),map(),r ...

  5. ORACLE应用调优:请避免SQL做大量循环逻辑处理

    前阵子遇到一个案例:一个同事说以前一个运行很正常的包,突然间比以前慢了很多,执行时间非常长,晚上的作业调用这个包跑了几个小时也没有跑出数据.于是我在跟踪.优化过程中定位到包中一个存储过程的一段SQL, ...

  6. MySQL Nested-Loop Join算法学习

    不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天 ...

  7. 百钱买百鸡问题 php版本

    /* * 百钱买百鸡问题 * * 我国古代数学家张丘建在<算经>一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五:鸡母一,值钱三:鸡雏三,值钱一:百钱买百鸡,则翁.母 ...

  8. for语句嵌套循坏性能的剖析

    日常工作中,处理数据难免会遇到遍历,for循环可能是我们用的比较多的了.本节就来探讨下for语句嵌套循环的性能,猜想下面两个语句的性能. 语句1 ; i < ; i++){ ; j < ; ...

  9. java经典题目

    /***********Ryear.java begin********************/ import java.util.Scanner;public class Ryear { /** ...

随机推荐

  1. H5 API编码、解码

    方式一.decodeURI 解码 encodeURI 编码 方式二. var str = 'hello'; //加密 data base 64编码 组成部分 0-9 a-z A-Z +/ = 64位个 ...

  2. MapDB使用入门

    背景 MapDB官网:http://www.mapdb.org 官方翻译之后的话:MapDB基于堆外存储.磁盘存储提供了Java的Maps.Sets.Lists.Queues等功能.它混合了Java集 ...

  3. [Python] 用python做一个游戏辅助脚本,完整思路

    一.说明 简述:本文将以4399小游戏<宠物连连看经典版2>作为测试案例,通过识别小图标,模拟鼠标点击,快速完成配对.对于有兴趣学习游戏脚本的同学有一定的帮助. 运行环境:Win10/Py ...

  4. ES6之解构

    1.ES6允许按照一定的模式,从数组中和对象中提取值,对变量进行赋值,这种称为解构(Distructuring): let [a,b,c] = [3,5,6];// 相当于 a=3,b=5,c=6 本 ...

  5. nginx-springboot-vue前后端分离跨域配置

    nginx-springboot-vue前后端分离跨域配置 引言 接着上篇--简单的springboot-vue前后端分离登录Session拦截的demo,其中跨域是通过springboot后端全局设 ...

  6. 【系统解读】SystemUI篇(一)SystemUI启动流程

    前言 SystemUI是系统启动中第一个用户肉眼可见的应用,其功能包罗万象,比如开机后看到的锁屏界面,充电时充电界面,状态栏,导航栏,多任务栏等,都是与Android手机用户息息相关的功能.所以不止S ...

  7. 【百度之星】【思维】hdu 6724Totori's Switching Game

    思维题,最后只要判断每个点的度数>=k即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #pragma ...

  8. CodeForces 1084 F Max Mex

    Max Mex 题意:问在树上的所有路中mex值最大是多少. 题解: 用线段树维护值. 区间[L,R]意味着 区间[L,R]的数可不可以合并. 重点就是合并的问题了. 首先合法的区间只有3种: 1. ...

  9. hdu 3709 Balanced Number(数位dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意:给定区间[a,b],求区间内平衡数的个数.所谓平衡数即有一位做平衡点,左右两边数字的力矩相 ...

  10. hdu 2844 Coins 多重背包(模板) *

    Coins                                                                             Time Limit: 2000/1 ...