所以我用一个换位密码实现了一个编码方法,我提供了一个密钥和一条文本消息。
可视化
钥匙:“伙计”
信息:“hellobro”
我根据关键字母的字母顺序分配数字(int数组)。
杜德
0 1 3 2
h和l
o b r o公司
算术排序
d d e u公司
0 1 2 3
h l e公司
o或o b
然后按列“读取”:加密消息:“holrloeb”
实施
import java.util.*;
public class test1 {
public static String encode(String textraw, String key){
int csize = 0, index = 0;
int[] numbers = {0,3,1,2};
int mod = textraw.length() % key.length();
int div = textraw.length() / key.length();
// calculate size of column
if (mod == 0) {
csize = div;
} else {
csize = div + 1;
}
int[] snumbers = numbers.clone();
Arrays.sort(snumbers);
// Sort columns
StringBuilder str = new StringBuilder(textraw.length());
for (int i = 0; i < numbers.length; i++) {
for (int j = 0; j < numbers.length; j++) {
if (snumbers[i] == numbers[j]){
index = snumbers[j];
break;
}
}
// create string column by column
for (int j = 0; j < csize; j++) {
if (index < textraw.length()) {
str.append(textraw.charAt(index));
index += numbers.length;
}
}
}
return str.toString();
}
public static void main(String[] args){
String s = "hellobro";
String keyk = "DUDE";
System.out.println("encrypted -> "+encode(s,keyk));
}
}
我的问题是如何重构encode方法,至少去掉第二个嵌套for循环?
我试过省略索引,但还没成功。。
任何帮助都将不胜感激!
1条答案
按热度按时间b5buobof1#
一般性意见
重构和代码风格在某种程度上是个人的。所以我想不是所有人都同意我的观点。一些好的实践可以确保代码简洁,但是类、方法和变量名也应该反映它们是什么和/或做什么。你选择的名字应该有助于阅读代码。如果一个方法太长,就创建一个新的方法来提高可读性。在当前代码中,可以用另一个方法替换csize的计算。您还可以选择更可读的变量,例如更改变量str。马丁福勒写了一个更受欢迎的。因此,这些小评论根本不涉及重构主题。
方法的目标
你解释了你想做什么。然而,你的钥匙(哥们)的用途似乎还不清楚。它实际上没有被使用。如果用其他键测试代码,则顺序完全相同。所以,好像有什么不对劲。
省略一个循环的代码
对于所有在这方面有丰富经验的人来说:这肯定可以得到更多的改进和/或可以采用不同的结构。此代码使用与原始post相同的方法参数,并生成与原始post相同的测试结果。我没有试图解释为什么没有使用钥匙(伙计)。
使用字符串键(伙计)
可以添加一个从字符串中获取排序键的方法。此方法生成排序的arraylist。所以你得做些数字
ArrayList<Integer> numbers = getKeyArray(key);
你必须改变numbers.length
至numbers.size()
和索引int foundIndex = numbers.indexOf(i);
方法getkeyarray和测试输出示例getkeyarray