【问题标题】:Java char array copying yielding weird resultsJava char 数组复制产生奇怪的结果
【发布时间】:2013-11-13 08:35:17
【问题描述】:

我想优化我的代码,因此我没有为字母表中的每次迭代复制整个 char 数组,而是选择预先进行复制,然后将字符添加到副本中。

例如:

复制“领主”(i=0)

修改第一个字母(aord、bord、cord &c)

复制“领主”(i=1)

修改第二个字母(lard、lbrd、lcrd &c)

&c

    for (int i = 0; i < wordLength; i++) {
        Word moddedWord = new Word(Arrays.copyOf(temp.word.content, wordLength));
        for (int c = 0; c < alphabetLength; c++) {
            if (alphabet[c] != temp.word.content[i]) {
                // Word moddedWord = new Word(Arrays.copyOf(temp.word.content, wordLength));
                moddedWord.content[i] = alphabet[c];
                Word res = WordList.Contains(moddedWord);
                if (res != null && WordList.MarkAsUsedIfUnused(res)) {
                    WordRec wr = new WordRec(res, temp);
                    q.Put(wr);
                }
            }
        }
    }

但是,当我进行这个小改动时,我的程序无法正常工作,而以前我使用注释行进行复制时。我已经连续调试了几个小时,我发现 nothing 可以改变它,我尝试了各种形式的复制,我尝试将“原始”单词存储为字符串,然后当我需要复制它时将它转换为 char 数组,似乎没有任何效果。哦顺便说一句,“Word”只是 char[] 的包装器(Word.content 是 char[] 字段)。

【问题讨论】:

  • “不起作用”是什么意思?您是一遍又一遍地存储同一个数组还是遇到异常,或者发生了什么?
  • 它实际上开始无限循环,这真的很奇怪,因为我一直在使用 IntelliJ 的调试器,它告诉我它只能到达 q.Put(wr) 有效词。

标签: java arrays copy char


【解决方案1】:

如果要存储单词的每个修改,则无法避免复制。这里:

new WordRec(res, temp);

您根据单词的 可变 实例创建单词记录,然后不断更改该实例。您需要在此构造函数中复制temp。因此,您实现的最佳效果是稍后复制,可能会因为它发生的“ifology”而减少一点。

现在,如果您真的想提高性能,请将 WordList 重新设计为 WordSet,并使用 Contains 方法进行 O(1) 查找。

最后一点:请尊重 Java 命名约定。方法以小写字母开头。

【讨论】:

  • 我目前正在为 WordList 使用 HashSet,因此 Contains 应该已经是 O(1)。我现在更改了 wordlist 的 Contains 方法,以制作 Word 的“深拷贝”。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 2015-10-04
  • 1970-01-01
相关资源
最近更新 更多