Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:重构编码密码_Java_Refactoring - Fatal编程技术网

java:重构编码密码

java:重构编码密码,java,refactoring,Java,Refactoring,所以我用一个换位密码实现了一个编码方法,我提供了一个密钥和一条文本消息 可视化 键:“都德” 信息:“hellobro” 我根据关键字母的字母顺序分配数字(int数组) dude 0132 HE l l o b r o 算术排序 D D E U 01 2 3 HLE o r o b 然后按列“读取”:加密消息:“holrloeb” 实施 import java.util.*; 公共类test1{ 公共静态字符串编码(字符串textraw,字符串键){ int csize=0,index

所以我用一个换位密码实现了一个编码方法,我提供了一个密钥和一条文本消息

  • 可视化
    键:“都德”
    信息:“hellobro”
    我根据关键字母的字母顺序分配数字(int数组)

    dude
    0132
    HE l l
    o b r o

算术排序
D D E U
01 2 3
HLE
o r o b

然后按列“读取”:加密消息:“holrloeb”

  • 实施
import java.util.*;
公共类test1{
公共静态字符串编码(字符串textraw,字符串键){
int csize=0,index=0;
int[]数={0,3,1,2};
int mod=textraw.length()%key.length();
int div=textraw.length()/key.length();
//计算柱的尺寸
如果(mod==0){
csize=div;
}否则{
csize=div+1;
}
int[]snumbers=numbers.clone();
数组。排序(snumbers);
//排序列
StringBuilder str=新的StringBuilder(textraw.length());
for(int i=0;i”+编码(s,keyk));
}
}
我的问题是如何重构encode方法,至少去掉第二个嵌套for循环

我试图省略索引,但尚未使其起作用。

任何帮助都将不胜感激

一般评论

重构和代码风格在某种程度上是个人的。所以我想不是所有人都同意我的观点。 一些好的实践可以确保代码简洁,但是类、方法和变量名也应该反映它们是什么和/或做什么。您选择的名称应该有助于阅读代码。如果一个方法太长,则创建一个新方法以提高可读性。 在当前代码中,可以用另一个方法替换csize的计算。您还可以选择更可读的变量,例如更改变量str。 有关于正确Java代码的完整书籍。马丁·福勒写了一本比较受欢迎的书。因此,这些小评论根本不涉及重构主题

方法的目标

你解释了你想做什么。然而,你的钥匙(花花公子)的用途似乎不清楚。它实际上没有被使用。如果您使用其他键测试代码,则其顺序完全相同。所以,似乎有什么不对劲

省略一个循环的代码

对于所有在这方面有丰富经验的人来说:这肯定可以进一步改进和/或采用不同的结构。此代码使用与原始post相同的方法参数,并生成与原始post相同的测试结果。我并没有试图解释为什么没有使用钥匙(老兄)

输出示例getKeyArray

"GFEABCD" Result: [3, 4, 5, 6, 2, 1, 0] 
"ABDCEFG" Result: [0, 1, 3, 2, 4, 5, 6]

“增加代码样式”?您会更改功能以获得外观更好的代码吗?你到底写了什么密码?谢谢你的回复,我的意思是我想更改我的柱状转置密码的代码结构,但保持功能不变,因为我的代码已经在工作了
private ArrayList<Integer> getKeyArray(String key) {
        String alfabet = "abcdefghijklmnopqrstuvwxyz";
        ArrayList<Integer> resultArrayList = new ArrayList<>();
        HashMap<Integer, Integer> charRank = new HashMap<>();
        for (int k = 0; k < key.length(); k++) {
             int alfabetIndex = alfabet.indexOf(Character.toLowerCase(key.charAt(k)));
             charRank.put(k, alfabetIndex);
        }
        charRank.entrySet()
                .stream()
                .sorted(Map.Entry.<Integer, Integer>comparingByValue()).forEach(e -> resultArrayList.add(e.getKey()));
        return resultArrayList;
    }

    public void testGetKeyArray() {
        String testInput;

        testInput = "ABDCEFG";
        System.out.println("Test getKeyArray with " + testInput);
        getKeyArray(testInput).forEach(System.out::println);

        testInput = "DUDE";
        System.out.println("Test getKeyArray with " + testInput);
        getKeyArray(testInput).forEach(System.out::println);
    }
"GFEABCD" Result: [3, 4, 5, 6, 2, 1, 0] 
"ABDCEFG" Result: [0, 1, 3, 2, 4, 5, 6]