首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作业:清理散列?

作业:清理散列?
EN

Stack Overflow用户
提问于 2016-10-06 20:52:38
回答 2查看 241关注 0票数 2

我正在使用Java8+中的NetBeans IDE 8.1

这是家庭作业的一部分,但这次我最想要的是一个答案。

我仅限于JDK,不允许使用以下代码:

  • 正则表达式
  • 缓冲读取器
  • 试/抓
  • 列表

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

对于简单的身份验证系统,我有很好的代码。在文本文件中,我有6个“用户”,具有用户名、摘要、纯文本密码以及他们的帐户角色。我已经把文本文件拉到了一个二维数组中,并将其与之进行比较。用户收到一个对话框以输入用户名,然后另一个对话框输入密码。while循环比较用户名和密码,然后报告Good login.Bad login.,问题是它对于第一个用户非常有效,或者输入了不正确的信息。对于用户2-6,它被卡在一个“输入用户名和密码”无限循环中。下面是相关代码。此外,预先感谢您的协助。

文件: credentials.txt:分隔符是\t (选项卡)和\r (回车)

代码语言:javascript
复制
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

主类的

代码语言:javascript
复制
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.");
            }
            }
        }
    }
}

和第二类:

代码语言:javascript
复制
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个用户名,并相应的密码,并收到“良好的登录”。

正在发生的事情:为用户2-6,我陷入了一个无限循环询问用户名和密码。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-06 21:05:34

只有当错误的登录尝试是>= 3时,才会结束while循环,否则,这个无限循环总是会发生的。另外,在从文件中读取所有条目后,还需要另一个条件来终止循环。

一项建议是,您可以在每次迭代中读取文件,填充数组,关闭文件,继续整个过程,再次读取文件、填充数组,并继续进行应该更改的操作,只需读取一次文件,填充二维数组并进行比较。

票数 1
EN

Stack Overflow用户

发布于 2016-10-06 21:24:48

运行您的代码时,我在读取credentials.txt时遇到了问题。若要验证代码是否正确读取机器上的credentials.txt,请将读取循环替换为

代码语言:javascript
复制
    // 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,以接受行提要字符作为分隔符:

代码语言:javascript
复制
    // Use carriage return and tab as token separators
    inFS.useDelimiter("[\\r\\n\\t]");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39905422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档