有没有比使用嵌套 for 循环“更快”的方法来迭代二维数组?

2024-01-03

我编写了一个程序,用于加密和解密使用四方密码读取的文件。目前,我将文件存储到字符数组中,将其传递到将其分解为二元组的函数中,并使用另一个函数中的嵌套 for 循环以这种方式对其进行加密。此时,我基本上正在尝试优化运行时间。是否有另一种方法可以迭代我正在使用的二维数组,该方法不使用两个 for 循环,或者最多只使用一个 for 循环?下面是相关代码:

文件处理程序.java

   import java.io.*;
    import java.util.*;

    public class FileHandler {
    private List<String> characters = new ArrayList<String>();
    public char fileToChar[];

    public void preEncryptionFile(String fileText) throws IOException {
        String line;

        FileInputStream fileReader = new FileInputStream(fileText);
        DataInputStream dataInputStream = new DataInputStream(fileReader);
        BufferedReader bufferedReader = 
               new BufferedReader(new InputStreamReader(dataInputStream));

        while ((line = bufferedReader.readLine()) != null) {
            characters.add(line);
        }

        String charsToString = characters.toString();

        charsToString = charsToString.replaceAll("[^a-zA-Z]", "").toUpperCase();

        fileToChar = charsToString.toCharArray();

        bufferedReader.close();
    }
}

FourSquareCipher.java

    import java.util.*;

    public class FourSquareCipher {
        List<Character> encryptionList = new ArrayList<Character>();
        List<Character> decryptionList = new ArrayList<Character>();

        private char[][] matrix = { 
                { 'A', 'B', 'C', 'D', 'E', 'Z', 'G', 'P', 'T', 'F' },
                { 'F', 'G', 'H', 'I', 'K', 'O', 'I', 'H', 'M', 'U' }, 
                { 'L', 'M', 'N', 'O', 'P', 'W', 'D', 'R', 'C', 'N' },
                { 'Q', 'R', 'S', 'T', 'U', 'Y', 'K', 'E', 'Q', 'A' }, 
                { 'V', 'W', 'X', 'Y', 'Z', 'X', 'V', 'S', 'B', 'L' },
                { 'M', 'F', 'N', 'B', 'D', 'A', 'B', 'C', 'D', 'E' }, 
                { 'C', 'R', 'H', 'S', 'A', 'F', 'G', 'H', 'I', 'K' },
                { 'X', 'Y', 'O', 'G', 'V', 'L', 'M', 'N', 'O', 'P' }, 
                { 'I', 'T', 'U', 'E', 'W', 'Q', 'R', 'S', 'T', 'U' },
                { 'L', 'Q', 'Z', 'K', 'P', 'V', 'W', 'X', 'Y', 'Z' } };

        public void encryptionBigram(char[] fileToText) {
            int i;
            char x, y;

            for (i = 0; i < fileToText.length - 1; i += 2) {
                x = fileToText[i];
                y = fileToText[i + 1];

                encryption(x, y);
            }
        }

        private void encryption(char x, char y) {
            int i, j;
            int a, b, c, d;

            a = b = c = d = 0;

            for (i = 0; i < 5; i++) {
                for (j = 0; j < 5; j++) {
                    if (x == matrix[i][j]) {
                        a = i;
                        b = j;
                    }
                }
            }

            for (i = 5; i < 10; i++) {
                for (j = 5; j < 10; j++) {
                    if (y == matrix[i][j]) {
                        c = i;
                        d = j;
                    }
                }
            }

            encryptionList.add(matrix[a][d]);
            encryptionList.add(matrix[c][b]);
        }
}

使用单个循环迭代二维数组。

更具体地说,此代码根据当前索引和子数组的宽度计算行和列。

仅当子数组具有固定长度/宽度时,这才有效。

我还没有对此进行基准测试,所以我不能确定它是否比您目前拥有的更有效。检查第二个条件和增加第二个变量的开销可能与计算行和列相同(甚至更少)。

尽管如此:

char[][] letters = {
    {'A', 'B', 'C'},
    {'D', 'E', 'F'},
    {'G', 'H', 'I'}
};

int width = 3;
int maxIndex = letters.length * width;
for(int i = 0; i < maxIndex; i++) {
    int row = i / width; // determines row
    int column = i % width; // determines column

    System.out.println("Value["+letters[row][column]+"] Row["+row+"] Column["+column+"]");
}

该行是通过除以索引来确定的(表示为i)按宽度。由于上例中子数组的宽度是3:

  • 如果索引是6,行数为 2。
  • 如果索引是9,行数为 3。
  • 如果索引是11,该行是 3.66(仍然是 3)

该列由模运算确定。由于上例中的每个子数组的宽度为3:

  • 如果索引是6,该列为 0。
  • 如果索引是9,该列为 0。
  • 如果索引是11,列为 2。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有比使用嵌套 for 循环“更快”的方法来迭代二维数组? 的相关文章

  • java 中的梵文 i18n

    我正在尝试使用来自互联网的示例 ttf 文件在 java 中使用 i18n 进行梵文 印地文 我可以加载资源包条目 还可以加载 ttf 并设置字体 但它不会根据需要呈现 jlabel 它显示块代替字符 如果我在 Eclipse 中调试 我可
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • H2数据库:如何进行加密保护,而不暴露文件加密密钥

    我们在服务器模式下使用Java H2数据库 因为我们不希望用户访问数据库文件 为了对数据库文件添加更多保护 我们计划使用 AES 加密 将 CIPHER AES 添加到数据库 URL 以防存储被盗 但是 每个用户在连接时还需要提供文件保护密
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 使用 Jena 查询维基数据

    目前 Wikidata 有一个 SPARQL 端点 https query wikidata org https query wikidata org 我想使用 Jena 3 0 1 查询此网站 我使用以下代码 但收到错误消息 端点返回的
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • PHP 使用主键和辅助键对多维数组进行排序[重复]

    这个问题在这里已经有答案了 如何按主键和辅助键对多维数组进行排序 例如 假设有以下数组 result array result 0 prio 1 result 0 date 2010 02 28 result 0 post February
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • 了解Kafka流groupBy和window

    我无法理解 kafka 流中的 groupBy groupById 和窗口的概念 我的目标是聚合一段时间内 例如 5 秒 的流数据 我的流数据看起来像 value 0 time 1533875665509 value 10 time 153
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • 如何在 spring-data 中强制使用 CrudRepository 进行预加载?

    我有一个实体 其中包含List就是这样lazy默认加载 interface MyEntityRepository extends CrudRepository
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 获取 Future 对象的进度的能力

    参考 java util concurrent 包和 Future 接口 我注意到 除非我弄错了 只有 SwingWorker 实现类才能启动冗长的任务并能够查询进度 这就引出了以下问题 有没有办法在非 GUI 非 Swing 应用程序 映
  • Spring - 如何在不匹配列名的情况下使用 BeanPropertyRowMapper

    我正在开发一个应用程序 该应用程序已使用行映射器从纯 JDBC 转换为 Spring 模板 我遇到的问题是数据库中的列与属性名称不匹配 这阻止我使用BeanPropertyRowMapper容易地 我看到一些关于在查询中使用别名的帖子 这会
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • 为什么不能在 if 语句中声明变量?

    以下 Java 代码无法编译 int a 0 if a 1 int b 0 if a 1 b 1 为什么 不能有任何代码路径导致程序将 1 分配给b无需先声明 我突然想到b的变量范围可能仅限于第一个if声明 但后来我不明白为什么 如果我实在
  • java Web应用程序中的日期转换

    String date1 13 03 2014 16 56 46 AEDT SimpleDateFormat sdf new SimpleDateFormat dd MM yyyy HH mm ss z sdf setTimeZone Ti
  • 如何使用socket.io发送图像文件(二进制数据)?

    我无法从以下位置发送数据Android Client to NodeJS Server I use Socket IO 客户端 https github com socketio socket io client java我的客户端中的ja

随机推荐

  • ReactNative TextInput placeholderTextColor 似乎不起作用

    这看起来是一件很简单的事情 我不明白我怎么做不好 但是占位符文本颜色在 ReactNative TextInput 上对我没有任何作用 http facebook github io react native docs textinput
  • Python 换行符 \n 在 jupyter 笔记本中不起作用

    我试图在我的 Jupyter Notebook 中整齐地显示 postgreSQL 表的元组 但是换行符 n 转义字符在这里似乎不起作用 它适用于我的 python 脚本 在 jupyter 之外具有相同的代码 我正在尝试运行 cur ex
  • SVN 将整个文件标记为冲突

    我是 SVN 新手 在分支上工作一天左右后 我尝试将主干的更改合并到分支 svn merge svn server trunk 问题是 每当 SVN 遇到冲突文件时 它都无法识别逐行更改并将整行标记为冲突 我尝试了其他几个 SVN 客户端
  • 如何将 buildapp 与预定义的 asd 文件一起使用

    我打算使用buildapp http www xach com lisp buildapp example用于从我的 lisp 代码中获取可执行文件 但我不明白如何为项目指定 asd 文件 以加载代码 我想象了一些像这样的电话 builda
  • 如何从maven项目引用公共GitHub包

    我有一个 GitHub 存储库 其中包含发布到其自己的 GitHub 包 maven 存储库的库 我还有另一个项目 我想在其中引用这个库作为依赖项 当我将以下配置添加到项目的 POM 文件中时 它不起作用
  • 使用 TCP 套接字发送多个小消息或较短的长消息哪个更快

    我可以在任何地方找到任何文档 并且想知道尽快发送多条消息的最佳方法是什么 例如 如果我有 300 个设备从一台服务器接收消息 那么最好发送一条大消息并让设备挑选出它们需要的部分 或者发送 300 条消息 但大小为 1 300 它们只是很小的
  • 关于如何将项目从 UITableView 拖放到 UITableView 的教程 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经在这个问题上摸索了一段时间了
  • 反应 |如何将 FormikProps 向上传递一个组件

    我正在努力通过values and props 该 formik 需要 1 个组件 我在某些表单中使用各种小组件 并将它们传递到一个复杂的组件中 该组件需要在调用时将它们传递给每个单独的渲染 基本上都是 FormikProps 这是一个这样
  • 在Flutter中添加OverlayEntry

    我正在尝试将容器插入覆盖层 但此代码出现错误 class MyHomePageState extends State
  • Swift:如何从 AVFoundation 拍摄的照片中删除 EXIF 数据?

    我正在努力摆脱EXIF来自拍摄照片的数据AV基金会 我怎样才能快速做到这一点 2 首选 Objective C也可以 我知道如何将代码转换为swift Why 我做了研究 看到了很多名人社交媒体 https www reddit com r
  • 使用 Laravel 的 Ajax Post 错误 422

    我正在尝试使用 Laravel 5 制作一个简单的 Ajax 帖子 我读到 Csrf 令牌匹配存在问题 我可以将我的 uri 放入 verifyCsrfToken 期望中以解决此问题 这部分功能正常 但是现在我在发帖时收到 422 错误 我
  • 如何使用宏在 C++ 中生成随机变量名称?

    我正在 C 中创建一个宏 它声明一个变量并为其分配一些值 根据宏的使用方式 第二次出现的宏可以覆盖第一个变量的值 例如 define MY MACRO int my variable random number here getCurren
  • 带有 root 密码的 Kubernetes mysql statefulset

    我按照这里的例子https kubernetes io docs tasks run application run replicated stateful application https kubernetes io docs task
  • Mathematica 中的分区统计图的最小示例是什么样的?

    一个最小的例子是什么等值线图 http en wikipedia org wiki Choropleth mapMathematica 中的地图是什么样的 我可以使用读取 ESRI ShapefileImport 但不知道如何处理导入的结果
  • MYSQL按日期累计总和[重复]

    这个问题在这里已经有答案了 我怎样才能做累计总和 我的查询是 select dateb ricetype bajet1 from bajet where ricetype grand total 我如何存档 新价值 你可以像下面这样做 se
  • 如何对 Flash 进行自动化 UI 测试 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 实体框架 - 使用存储过程预先加载对象图

    背景 我正在将项目中的 LINQ to SQL 代码更改为实体框架 大多数改变都相对简单 但是 我遇到了一个相当大的问题 借助 LINQ to SQL 我能够使用存储过程加载整个对象图 对于模型 B 如下所示 ViewModel Model
  • CFFI 在 Python (Linux) 虚拟环境中失败——尝试在 venv 中安装加密包

    在虚拟环境中安装cffi遇到错误 但是好像可以安装 这些错误真的很严重吗 这些错误可能会导致安装加密时失败 请参阅下文 pip install cffi 1 11 5 下载 解压cffi 1 11 5 下载cffi 1 11 5 tar g
  • 如何在 Angular2 中使用变量定义 templateUrl

    我想要组件设置templateUrl与一个变量 但它不起作用 Component selector article templateUrl article html styleUrls styles stylesheets article
  • 有没有比使用嵌套 for 循环“更快”的方法来迭代二维数组?

    我编写了一个程序 用于加密和解密使用四方密码读取的文件 目前 我将文件存储到字符数组中 将其传递到将其分解为二元组的函数中 并使用另一个函数中的嵌套 for 循环以这种方式对其进行加密 此时 我基本上正在尝试优化运行时间 是否有另一种方法可