家庭作业:清除哈希值?

时间:2016-10-06 20:52:39

标签: java

我在 NetBeans IDE 8.1 中使用 Java8 +

这是家庭作业的一部分,但这一次我找的答案比什么都重要。

我基本上只限于JDK,不允许使用以下代码:

  • 正则表达式
  • 缓冲读卡器
  • 尝试/捕获
  • 解释

基本上我的选项仅限于变量,基本字符串方法(indexOf(),contains()等),for / while循环,if / then或if / else,FileInputStream,Scanner和其他非常基本的代码。即使使用我的Delimiter将文件读入数组也可能会有问题。

我有一个简单的身份验证系统的代码。在文本文件中,我有6个“用户”,其中包含用户名,摘要,纯文本密码及其帐户角色。我把文本文件拉成了一个二维数组,并用它来比较。用户收到一个对话框输入用户名,然后另一个输入密码。 while循环会比较用户名和密码,然后报告Good login.Bad login.问题是,它对第一个用户有效,或者输入的信息不正确。对于用户2-6,它会陷入“输入用户名和密码”无限循环。以下是相关代码。另外,请提前感谢您的帮助。

文件:credentials.txt:分隔符为\ t(制表符)和\ r \ n(回车符)

griffin.keyes   108de81c31bf9c622f76876b74e9285f    alphabet soup   zookeeper
rosario.dawson  3e34baa4ee2ff767af8c120a496742b5    animal doctor   admin
bernie.gorilla  a584efafa8f9ea7fe5cf18442f32b07b    secret password veterinarian
donald.monkey   17b1b7d8a706696ed220bc414f729ad3    M0nk3y business zookeeper
jerome.grizzlybear  3adea92111e6307f8f2aae4721e77900    grizzly1234 veterinarian
bruce.grizzlybear   0d107d09f5bbe40cade3de5c71e9e9b7    letmein admin

主要课程:

import java.io.IOException;

public class TestAuthenticationSystem {
    public static void main(String[] args) throws IOException, Exception {
        TestSystemLogin sysLogin = new TestSystemLogin();  // Object of SystemLogin
        int loginCounter = 0;                      // Tracks login attempts.
        final int LOGIN_MAX = 3;                   // Max login attempts.

        // Have User attempt to login.
        while (loginCounter <= (LOGIN_MAX - 1)) {
            sysLogin.setCredArray();
            sysLogin.setCredentials();                     // Set credentials
            if (sysLogin.matchUsername(sysLogin.getCredArray(), sysLogin.getUsername()) == true) {
                if (sysLogin.passwordMatch(sysLogin.getCredArray(), sysLogin.getUsername())
                    == true) {
                    System.out.println("Good login.");
                    break;
                }
            else {
                ++loginCounter;
                System.out.println("Bad login.");
            }
            }
        }
    }
}

第二节课:

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class TestSystemLogin {
    private FileInputStream fileByteStream = null; // File input stream
    private Scanner inFS = null;                   // Scanner object
    final private Scanner input;
    private String username = "";                       // Holds username
    private String password = "";                       // Holds password
    private final String [][] credArray = new String[6][4];                 // Array for credentials.txt

    public TestSystemLogin() {
        this.input = new Scanner(System.in);
    }

    public void setCredentials() {
        System.out.println("Enter Username: ");
        username = input.next().toLowerCase();

        input.nextLine();
        System.out.println("Enter Password: ");
        password = input.nextLine();
    }

    // Return variable username.
    public String getUsername() {
        return username;
    }

    // Return variable password.
    public String getPassword() {
        return password;
    }

    public void setCredArray() throws IOException {
        int i = 0;                                 // Index variable
        int j = 0;                                 // Index variable

        // Import credentials data.
        fileByteStream = new FileInputStream("credentials.txt");
        inFS = new Scanner(fileByteStream);

        // Use carriage return and tab as token separators
        inFS.useDelimiter("[\\r\\t]");

        // Create array of credentials.txt
        for (i = 0; i < 6; ++i) {
            for (j = 0; j < 4; ++j) {
                credArray[i][j] = inFS.next();
            }
        }
        fileByteStream.close(); //Closes file.
    }    

    public String[][] getCredArray() {
        return credArray;
    }

    // Compare username to recorded username.
    public boolean matchUsername(String[][] credArray, String userUsername)           boolean isTrue = false;
        int i = 0;

        for (i = 0; i < credArray.length; ++i) {
            if (credArray[i][0].equals(userUsername)) {
                isTrue = true;
                break;
            }
        }        
        return isTrue; 
    }

public boolean passwordMatch(String[][] credArray, String userUsername) {
        boolean isTrue = false;
        int i = 0;

        for (i = 0; i < credArray.length; ++i) {
            if (credArray[i][0].equals(userUsername)) {
                if (credArray[i][2].equals(password)) {
                   isTrue = true;
                   break; 
                }                
            }
        }        
        return isTrue; 
    }

}

期待的内容: 我可以输入6个用户名中的任意一个,以及相应的密码,并收到“Good login。”

发生了什么: 对于2-6号用户,我陷入了无限循环,要求输入用户名和密码。

以前的答案建议不要使用二维数组,而是将每个用户信息放入一个类中。这可能不创建额外的类吗?如果是这样,请提供所述类的示例,以及为每个用户调用的相应代码。

2 个答案:

答案 0 :(得分:1)

只有在错误登录尝试> = 3时,您的while循环才会结束,否则,将始终发生此无限循环。此外,一旦从文件中读取所有条目,就需要另一个条件来终止循环。

一个建议,你在迭代中读取文件,填充数组,关闭文件,继续整个过程,再次读取文件,填充数组并继续执行应该以只读文件的方式更改的文件一次,填充二维数组并进行比较。

答案 1 :(得分:0)

运行代码我在阅读credentials.txt时遇到了问题。要验证您的代码是否在您的计算机上正确读取了credentials.txt,请输出您使用

替换读取循环所读取的数据
    // Create array of credentials.txt
    for (i = 0; i < NUM_ROWS_CRED; ++i) {
        for (j = 0; j < NUM_COLS_CRED; ++j) {
            String s = inFS.next();
            System.out.print(s+" ");
            credArray[i][j] = s;
        }
        System.out.println();
    }

最后,我不得不重新配置扫描仪以读取credentials.txt以接受换行字符作为分隔符:

    // Use carriage return and tab as token separators
    inFS.useDelimiter("[\\r\\n\\t]");