验证号码输入

时间:2017-03-25 11:19:53

标签: java android validation

我正在研究验证问题,我需要提出一个验证解决方案。

用户应输入一个4位数的密码。适用于它的验证规则应该是。

  1. 密码不能是连续数字,即1234或9876
  2. 不能重复,即1111,2222
  3. 它不能是连续的三个数字系列,即1345,9765
  4. 它不能是相同的数字三元组,即2444,1115。
  5. 现在,我到目前为止所做的是: 我尝试使用这个公式,这是在另一个解决方案中给出的,但它没有帮助。 将输入分解为int []并获得第一个&来自它的最后一项,然后应用验证。

    A [length-1] - A [0] = A.length-1 这适用于连续数字,1234,9876,但是当我输入1324时它会中断,这是有效的。

    然后,为了验证重复,我想使用一个集合,输入集合中的数字,然后检查集合的大小,如1111,2222。但是,它在1212情况下再次失败,这是一个有效的输入。

    虽然,这可以通过在每个数字中加1或减1来检验,并检查它是否连续,但我正在寻找其他的东西。那个解决方案将是我最后的方法。

    java中的解决方案赞赏。如果没有,那么简单的伪代码也没问题。 假设只能输入数字作为输入。

    更新: 对不起,伙计们,我不把SO作为一种做功课的方式,但我认为这些信息已经足够了。无论如何,这是我到目前为止所管理的,

    private boolean checkFirstOrderAscendingDescending(int[] array, int length) {
            // to handle passwords like 1234, 9876
            int arrayItemOne = array[0];
            int arrayItemLast = array[length - 1];
    
            if (Math.abs(arrayItemLast - arrayItemOne) == length - 1) {
                return false;
            } else {
                return true;
            }
        }
    
    private boolean checkDuplicates(int[] array, int length) {
            // to handle passwords like 1112, 9998
            int arrayItemOne = array[0];
            int arrayItemTwo = array[1];
            int arrayItemThree = array[2];
    
            if (arrayItemOne == arrayItemTwo && arrayItemTwo == arrayItemThree) {
                return false;
            } else {
                return true;
            }
        }
    

    可以扩展check duplicates方法以检查数组的第1,第2和第3个索引中的重复项。在调用这些方法之前,将对数组进行null检查。此外,可以保证数组的长度始终为4,因此请求特定索引永远不会给出ArrayIndexOutOfBounds。

    我希望现在提供的信息足够了。

1 个答案:

答案 0 :(得分:1)

这是我的解决方案。请不要将SO视为绕过家庭作业的一种方式

private static final int MAXIMUM_DUPLICATES = 2;
private static final int MAXIMUM_SERIES = 2;
private static final int SERIES_DIRECTION_ASCENDING = 0x42;
private static final int SERIES_DIRECTION_DESCENDING = ~SERIES_DIRECTION_ASCENDING;
public static boolean isPasswordValid(String pwd) {
    char lastChar = '\0';
    int duplicateCount = 1;
    int seriesCount = 1;
    int seriesDirection = 0; 

    char[] chars = pwd.toCharArray();
    for(char c : chars) {
        //skip the first character
        if(lastChar > 0) {
            if(lastChar == c)
                duplicateCount++;
            else
                duplicateCount = 1;

            if(lastChar == c+1) {
                //was the previous char of the same series? if not then reset the seriesCount
                if(seriesDirection != SERIES_DIRECTION_ASCENDING) {
                    seriesCount = 1;
                    seriesDirection = SERIES_DIRECTION_ASCENDING;
                }

                seriesCount++;
            } else if(lastChar == c-1) {
                if(seriesDirection != SERIES_DIRECTION_DESCENDING) {
                    seriesCount = 1;
                    seriesDirection = SERIES_DIRECTION_DESCENDING;
                }

                seriesCount++;
            } else {
                seriesCount = 1;
            }

            //are there more duplicates then are allowed?
            if(duplicateCount > MAXIMUM_DUPLICATES)
                return false;

            //is there a longer series then allowed?
            if(seriesCount > MAXIMUM_SERIES)
                return false;
        }

        //save the last character
        lastChar = c;
    }

    return true;
}

在这里我的检查方式

public static void main(String[] args) {
    Map<String, Boolean> inputsAndExpectedResults = new HashMap<>();

    inputsAndExpectedResults.put("1234", false);
    inputsAndExpectedResults.put("4321", false);
    inputsAndExpectedResults.put("1122", true);
    inputsAndExpectedResults.put("8143", true);
    inputsAndExpectedResults.put("1265", true);
    inputsAndExpectedResults.put("9233", true);
    inputsAndExpectedResults.put("9137", true);
    inputsAndExpectedResults.put("2222", false);
    inputsAndExpectedResults.put("4333", false);
    inputsAndExpectedResults.put("5421", true);
    inputsAndExpectedResults.put("6667", false);
    inputsAndExpectedResults.put("4569", false);
    inputsAndExpectedResults.put("1272", true);

    Set<String> keySet = inputsAndExpectedResults.keySet();
    for(String key : keySet) {
        Boolean expectedValue = inputsAndExpectedResults.get(key);

        boolean result = isPasswordValid(key);
        String output = String.format("isPasswordValid(%s) returned %b expected %b", key, result, expectedValue);
        if(expectedValue.equals(result))
            System.out.println(output);
        else
            System.err.println(output);
    }
}