Java QWERTY键盘中检查连续字母的算法

Java QWERTY键盘中检查连续字母的算法,java,algorithm,passwords,Java,Algorithm,Passwords,我需要用Java编写一个算法来验证密码字段。 在所有基本控件(最小长度、lunghezza massima、字母数字…)之间,我必须检查密码是否由键盘上的字符顺序组成(例如QWERTY、YTREWQ、ASDFGH等)。 密码的最小长度为8个字符。密码在4位数字后不合格 我不能在我的数据库中创建一个带有“禁止”字符串的“字典表”,关于现有算法的任何提示,或者是否有库已经在做这样的检查?嗯。。。我想到一件事 您可以尝试构建字母矩阵: ----------------------- | q w e

我需要用Java编写一个算法来验证密码字段。 在所有基本控件(最小长度、lunghezza massima、字母数字…)之间,我必须检查密码是否由键盘上的字符顺序组成(例如QWERTY、YTREWQ、ASDFGH等)。 密码的最小长度为8个字符。密码在4位数字后不合格
我不能在我的数据库中创建一个带有“禁止”字符串的“字典表”,关于现有算法的任何提示,或者是否有库已经在做这样的检查?

嗯。。。我想到一件事

您可以尝试构建字母矩阵:

-----------------------
| q  w  e  r  t  y  ... 
| a  s  d  f  g  h  ... etc.
| z  x  c  v  b  n  ... 
-----------------------
给每个字母一个索引。例如,“q”有[1,1],“w”有[2,1],“v”有[4,3]等等

现在,给定一个字符串,找出每个字母之间的距离并求和

示例:
给定字符串“sdgh”:

现在你的比例是4/4。(四个字母,总距离为四)

这符合你的安全要求吗?回答这个问题,您就完成了。

好的,这是我的解决方案,它对于水平检查似乎非常有效。如果距离>4,则表示密码无效。有什么改进的建议吗?我知道这是一个有点硬编码,但目前我可以通过它

    @Test
public void runCheckDigit() {

    checkdigit("cnqwerty13");

}

public void checkdigit(String password) {

    int x = 4;
    int y = 10;

    String[][] keyboard = new String[x][y];


    // first row
    keyboard[0][0] = "1";
    keyboard[0][1] = "2";
    keyboard[0][2] = "3";
    keyboard[0][3] = "4";
    keyboard[0][4] = "5";
    keyboard[0][5] = "6";
    keyboard[0][6] = "7";
    keyboard[0][7] = "8";
    keyboard[0][8] = "9";
    keyboard[0][9] = "0";

    // second row
    keyboard[1][0] = "q";
    keyboard[1][1] = "w";
    keyboard[1][2] = "e";
    keyboard[1][3] = "r";
    keyboard[1][4] = "t";
    keyboard[1][5] = "y";
    keyboard[1][6] = "u";
    keyboard[1][7] = "i";
    keyboard[1][8] = "o";
    keyboard[1][9] = "p";
    // TERZA RIGA
    keyboard[2][0] = "a";
    keyboard[2][1] = "s";
    keyboard[2][2] = "d";
    keyboard[2][3] = "f";
    keyboard[2][4] = "g";
    keyboard[2][5] = "h";
    keyboard[2][6] = "j";
    keyboard[2][7] = "k";
    keyboard[2][8] = "l";
    keyboard[2][9] = "ò";
    // third row
    keyboard[3][0] = "z";
    keyboard[3][1] = "x";
    keyboard[3][2] = "c";
    keyboard[3][3] = "v";
    keyboard[3][4] = "b";
    keyboard[3][5] = "n";
    keyboard[3][6] = "m";
    keyboard[3][7] = ",";
    keyboard[3][8] = ".";
    keyboard[3][9] = "-";

    printMatrix(keyboard, x, y);

    List<Coordinata> cList = new ArrayList<Coordinata>();

    for (int i = 0, n = password.length(); i < n; i++) {
        char s = password.toLowerCase().charAt(i);
        cList.add(getCoordinate(s, keyboard));
    }
    int distanza = 0;

    for (int i = 0; i < cList.size()-1; i++) {
        distanza = distanza + distanceElement(cList.get(i), cList.get(i + 1));
    }

    System.out.println("distanza : " + distanza);
}


private static Coordinata getCoordinate(char s, String[][] keyboard) {
    Coordinata c = null;
    for (int i = 0; i < keyboard.length; ++i) {
        for (int j = 0; j < keyboard[0].length; ++j) {
            if (keyboard[i][j].equals(Character.toString(s))) {
                // Found the correct i,j 
                return c = new Coordinata(i, j, Character.toString(s));
            }
        }
    }
    return c;
}

private static int distanceElement(Coordinata c1, Coordinata c2) {
    int distance = 0;       
    distance = Math.abs(c2.getX() - c1.getX()) + Math.abs(c2.getY() - c1.getY());
    System.out.println("Distance: " + c1.getLettera() + "->" + c2.getLettera() + " = " + distance);     
    return distance;
}

private static void printMatrix(String[][] matrix, int matrixRow, int matrixCol) {
    System.out.println("Matrix is : ");
    for (int i = 0; i < matrixRow; i++) {
        for (int j = 0; j < matrixCol; j++) {
            System.out.print(matrix[i][j] + "\t");
        }
        System.out.println();
    }
}
@测试
public void runCheckDigit(){
校验位(“cnqwerty13”);
}
公共无效校验位(字符串密码){
int x=4;
int y=10;
字符串[]键盘=新字符串[x][y];
//第一排
键盘[0][0]=“1”;
键盘[0][1]=“2”;
键盘[0][2]=“3”;
键盘[0][3]=“4”;
键盘[0][4]=“5”;
键盘[0][5]=“6”;
键盘[0][6]=“7”;
键盘[0][7]=“8”;
键盘[0][8]=“9”;
键盘[0][9]=“0”;
//第二排
键盘[1][0]=“q”;
键盘[1][1]=“w”;
键盘[1][2]=“e”;
键盘[1][3]=“r”;
键盘[1][4]=“t”;
键盘[1][5]=“y”;
键盘[1][6]=“u”;
键盘[1][7]=“i”;
键盘[1][8]=“o”;
键盘[1][9]=“p”;
//里加塔尔萨酒店
键盘[2][0]=“a”;
键盘[2][1]=“s”;
键盘[2][2]=“d”;
键盘[2][3]=“f”;
键盘[2][4]=“g”;
键盘[2][5]=“h”;
键盘[2][6]=“j”;
键盘[2][7]=“k”;
键盘[2][8]=“l”;
键盘[2][9]=“ò”;
//第三排
键盘[3][0]=“z”;
键盘[3][1]=“x”;
键盘[3][2]=“c”;
键盘[3][3]=“v”;
键盘[3][4]=“b”;
键盘[3][5]=“n”;
键盘[3][6]=“m”;
键盘[3][7]=“,”;
键盘[3][8]=”;
键盘[3][9]=“-”;
打印矩阵(键盘,x,y);
List cList=new ArrayList();
for(int i=0,n=password.length();i“+c2.getLettera()+”=“+Distance”);
返回距离;
}
私有静态void printMatrix(字符串[][]矩阵,int matrixRow,int matrixCol){
System.out.println(“矩阵为:”);
对于(int i=0;i
连续有多少个
QWERTY
字母会取消密码资格?你自己试过什么了吗?嗨@Tim Biegeleisen,谢谢你的回复。是的,我确实喜欢一个非常基本的演示,使用一个列表来检查是否包含密码。当然,这个解决方案并不可靠,因为我需要将所有这些可能的“单词”添加到列表中。密码在4位数后被取消资格。这不能回答我的问题。若你们想在这里得到帮助,你们应该澄清你们在问什么。为什么你们不能创建一个包含禁止子字符串的字典,应该只有大约40个(当反向也是禁止的时候是80个)?Hi@SaiBot,是的,也禁止倒车。我认为如果你还考虑数字和特殊字符,这是超过40/80个被禁止的词。嗨,帕维尔,这是个好提示。但是如果密码以1QAZ开头怎么办?从技术上讲,水平距离可以,但垂直距离不行。我应该检查两个方向的总距离吗?大多数键盘没有矩形布局,但更复杂的布局是“z”位于“a”和“s”的中间位置;因此,如果你想计算垂直距离,它会更混乱——我假设你不想要'zse4xdr5'。此外,不同国家的键盘也不同——在德国键盘上,我认为“y”是左下角而不是“z”。@aramone,您应该检查水平和垂直距离。q和a的距离仍然是1。这是一个棘手的问题。你可以将距离视为2或1,如你所愿。此外,你可以改进算法并在每个垂直移位中加一个距离点,如果你想要的话。因此,“cft6yhn”将给出12的距离。谢谢您的提示。我现在正在编写第一个解决方案,我会随时通知您!我建议您使用映射在O(1)时间内查找字符的索引,而不是在数组中循环。使用它而不是“键盘”数组。
    @Test
public void runCheckDigit() {

    checkdigit("cnqwerty13");

}

public void checkdigit(String password) {

    int x = 4;
    int y = 10;

    String[][] keyboard = new String[x][y];


    // first row
    keyboard[0][0] = "1";
    keyboard[0][1] = "2";
    keyboard[0][2] = "3";
    keyboard[0][3] = "4";
    keyboard[0][4] = "5";
    keyboard[0][5] = "6";
    keyboard[0][6] = "7";
    keyboard[0][7] = "8";
    keyboard[0][8] = "9";
    keyboard[0][9] = "0";

    // second row
    keyboard[1][0] = "q";
    keyboard[1][1] = "w";
    keyboard[1][2] = "e";
    keyboard[1][3] = "r";
    keyboard[1][4] = "t";
    keyboard[1][5] = "y";
    keyboard[1][6] = "u";
    keyboard[1][7] = "i";
    keyboard[1][8] = "o";
    keyboard[1][9] = "p";
    // TERZA RIGA
    keyboard[2][0] = "a";
    keyboard[2][1] = "s";
    keyboard[2][2] = "d";
    keyboard[2][3] = "f";
    keyboard[2][4] = "g";
    keyboard[2][5] = "h";
    keyboard[2][6] = "j";
    keyboard[2][7] = "k";
    keyboard[2][8] = "l";
    keyboard[2][9] = "ò";
    // third row
    keyboard[3][0] = "z";
    keyboard[3][1] = "x";
    keyboard[3][2] = "c";
    keyboard[3][3] = "v";
    keyboard[3][4] = "b";
    keyboard[3][5] = "n";
    keyboard[3][6] = "m";
    keyboard[3][7] = ",";
    keyboard[3][8] = ".";
    keyboard[3][9] = "-";

    printMatrix(keyboard, x, y);

    List<Coordinata> cList = new ArrayList<Coordinata>();

    for (int i = 0, n = password.length(); i < n; i++) {
        char s = password.toLowerCase().charAt(i);
        cList.add(getCoordinate(s, keyboard));
    }
    int distanza = 0;

    for (int i = 0; i < cList.size()-1; i++) {
        distanza = distanza + distanceElement(cList.get(i), cList.get(i + 1));
    }

    System.out.println("distanza : " + distanza);
}


private static Coordinata getCoordinate(char s, String[][] keyboard) {
    Coordinata c = null;
    for (int i = 0; i < keyboard.length; ++i) {
        for (int j = 0; j < keyboard[0].length; ++j) {
            if (keyboard[i][j].equals(Character.toString(s))) {
                // Found the correct i,j 
                return c = new Coordinata(i, j, Character.toString(s));
            }
        }
    }
    return c;
}

private static int distanceElement(Coordinata c1, Coordinata c2) {
    int distance = 0;       
    distance = Math.abs(c2.getX() - c1.getX()) + Math.abs(c2.getY() - c1.getY());
    System.out.println("Distance: " + c1.getLettera() + "->" + c2.getLettera() + " = " + distance);     
    return distance;
}

private static void printMatrix(String[][] matrix, int matrixRow, int matrixCol) {
    System.out.println("Matrix is : ");
    for (int i = 0; i < matrixRow; i++) {
        for (int j = 0; j < matrixCol; j++) {
            System.out.print(matrix[i][j] + "\t");
        }
        System.out.println();
    }
}