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

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

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

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

  1. package com.xinyan.springcloud.tjt;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.apache.commons.lang.StringUtils;
  9.  
  10. import lombok.Data;
  11.  
  12. public class CompareOne {
  13. private static List<KeyInfo> list1 = new ArrayList<>();
  14. private static List<CipherPathInfo> list2 = new ArrayList<>();
  15.  
  16. /**
  17. * 比较low的methodOne设计
  18. */
  19. public void methodOne() {
  20. // 匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:
  21. // 设计方案1:
  22. for (int i = 0; i < list1.size(); i++) {
  23. KeyInfo keyInfo = list1.get(i);
  24. String keyName = keyInfo.getKeyName();
  25. String cipher = keyInfo.getCipher();
  26. for (int j = 0; j < list2.size(); j++) {
  27. CipherPathInfo cipherPathInfo = list2.get(j);
  28. String keyName2 = cipherPathInfo.getKeyName();
  29. if (StringUtils.equals(keyName, keyName2)) {
  30. cipherPathInfo.setCipher(cipher);
  31. }
  32. }
  33. }
  34. }
  35.  
  36. /**
  37. * 较好的methodTwo设计
  38. */
  39. public void methodTwo() {
  40. // 匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:
  41. // 设计方案2:
  42. Map<String, String> keyNameMap = new HashMap<>();
  43. // 使用keyNameMap缓存keyName的cipher
  44. for (int i = 0; i < list1.size(); i++) {
  45. KeyInfo keyInfo = list1.get(i);
  46. String keyName = keyInfo.getKeyName();
  47. String cipher = keyInfo.getCipher();
  48. keyNameMap.put(keyName, cipher);
  49. }
  50. // 根据keyName的名称查keyNameMap取出cipher
  51. for (int j = 0; j < list2.size(); j++) {
  52. CipherPathInfo cipherPathInfo = list2.get(j);
  53. String keyName = cipherPathInfo.getKeyName();
  54. String cipher = keyNameMap.get(keyName);
  55. if (StringUtils.isNotEmpty(cipher)) {
  56. cipherPathInfo.setCipher(cipher);
  57. }
  58. }
  59. }
  60.  
  61. /**
  62. * 实体KeyInfo
  63. *
  64. * @author apple
  65. */
  66. @Data
  67. class KeyInfo {
  68. private String keyName;
  69. private String cipher;
  70. }
  71.  
  72. /**
  73. * 实体CipherPathInfo
  74. *
  75. * @author apple
  76. */
  77. @Data
  78. class CipherPathInfo {
  79. private String keyName;
  80. private String cipher;
  81. private String path;
  82. }
  83.  
  84. /**
  85. * 构造KeyInfo、CipherPathInfo实体信息
  86. */
  87. public void makeEntityInfo() {
  88. KeyInfo keyInfo = new KeyInfo();
  89. // 构造30个keyInfo实体
  90. for (int i = 0; i < 30; i++) {
  91. keyInfo.setKeyName("name_" + i);
  92. keyInfo.setCipher("cipher_" + i);
  93. list1.add(keyInfo);
  94. }
  95. CipherPathInfo cipherPathInfo = new CipherPathInfo();
  96. // 构造100个ciperhPathInfo实体,其中cipher为null
  97. for (int j = 0; j < 100; j++) {
  98. cipherPathInfo.setKeyName("name_" + j);
  99. cipherPathInfo.setPath("path_" + j);
  100. list2.add(cipherPathInfo);
  101. }
  102. }
  103.  
  104. public static void main(String[] args) {
  105. CompareOne c = new CompareOne();
  106. c.makeEntityInfo();
  107. // 匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:
  108. // 设计方案1:
  109. c.methodOne();
  110. // 方案1设计明显不合理,很low;其中list1有30个元素,而list2有100个
  111. // 这样就会累计循环30*100次
  112. // 可以将讲list1中获取到的keyName插入哈希中,只需要O(1)的纬度
  113. // 方案设计2:
  114. c.methodTwo();
  115.  
  116. }
  117.  
  118. }

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. 谷歌移动UI框架Flutter教程之Widget

    引言 在之间我已经介绍了关于Flutter的下载安装以及配置,还有开发工具Android Studio的配置,还不知道的同学可以看看我这篇博客--谷歌移动UI框架Flutter入门.这里为什么非要用A ...

  2. HillCrest Sensor HAL

    1. 抽象定义 Google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层,Android中Sensor的HAL接口定义在:hardware/libha ...

  3. FZU - 1914

    题意略. 思路: 我们应该着重关注负数对当前数列的影响,由于前缀和的性质,我们都是从当前数字向前加,这其实也是在枚举以哪个下标作为开头. 详见代码: #include<stdio.h> # ...

  4. CodeForces 989C

    题意略. 思路:如图 详见代码: #include<bits/stdc++.h> #define maxn 55 using namespace std; char board[maxn] ...

  5. 六.html基础

    web前端前几个月学过一段时间,现在在学习一遍,当作复习,最重要的看看web渗透常用的标签! <html></html>  不带任何属性 <body></bo ...

  6. three.js模拟实现太阳系行星体系

    概况如下: 1.SphereGeometry实现自转的太阳: 2.RingGeometry实现太阳系星系的公转轨道: 3.ImageUtils加载球体和各行星贴图: 4.canvas中createRa ...

  7. 浅谈TCP协议,总算明白它是干什么的了

    一.什么是TCP,他是干什么的? TCP即传输控制协议(Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通讯协议. TCP是为了在不可靠的互联网 ...

  8. 基于ASP.Net Core开发的一套通用后台框架

    基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...

  9. 【Edu49 1027D】 Mouse Hunt DFS 环

    1027D. Mouse Hunt:http://codeforces.com/contest/1027/problem/D 题意: 有n个房间,每个房间放置捕鼠器的费用是不同的,已知老鼠在一个房间x ...

  10. 【百度之星】【java大数+C++做法】hdu 6719 Strassen

    代码:递归搜索一下.java大数做法 import java.util.*; import java.math.*; import java.security.MessageDigest; publi ...