我刚刚了解了哈希图,所以我想制作一个提供登录和注册服务的小应用程序。做的时候卡住了,登录方法没做完。
Member.java -
public class Member {
private final String username;
private final String password;
private final String firstName;
private static final Map<String, String> loginMember = new HashMap<>();
public Member(String username, String password, String firstName) {
this.username = username;
this.password = password;
this.firstName = firstName;
}
public String getUsername() {
return this.username + "";
}
public String getPassword() {
return this.password + "";
}
public String getFirstName() {
return this.firstName + "";
}
public boolean isMemberExist(Member member){
if(loginMember.containsKey(member.getUserName()) && loginMember.containsValue(member.getPassword())){
return true;
} else {
System.out.println("No member in the list!");
}
return false;
}
public void register(Member member) {
if(isMemberExist(member)) {
System.out.println("This member is already exist!");
} else {
loginMember.put(member.getUsername(),member.getPassword());
}
}
public void login(Member member){
if(isMemberExist(member)) {
System.out.println("Hello " + member.getFirstName());
} else {
System.out.println("No member with username " +member.getUsername());
}
}
Main.java -
public class Main {
private static final Scanner sc = new Scanner(System.in);
private static Member member = new Member("blabla","blabla","bla");
public static void main(String[] args) {
boolean exitRequested = false;
while(!exitRequested) {
System.out.println("Press: " + "\n" +
"\r" + "1.Register" + "\n" +
"\r" + "2.Log in" + "\n" +
"\r" + "3.Exit.");
int choice = sc.nextInt();
switch (choice){
case 1:
register();
break;
case 2:
login();
break;
case 3:
exitRequested = true;
break;
default:
System.out.println("?");
break;
}
}
}
public static void register() {
System.out.println("What's your first name?");
String firstName = sc.next();
System.out.println("Please enter username");
String username = sc.next();
System.out.println("Please enter password");
String password = sc.next();
Member newMember = new Member(username,password,firstName);
member.register(newMember);
}
public static void login(){ // here I got stuck I seriously dont know how to continue...
System.out.println("Username:");
String username = sc.next();
System.out.println("Password:");
String password = sc.next();
}
如何修复此代码?
答案 0 :(得分:0)
您的代码的问题在于 HashMap 在另一个类中,而您的“登录”在 Main 类中。因此,您需要从主类访问 Member 类中的 HashMap
我对代码进行了必要的更改,以使 HashMap 可从另一个类访问。我也删除了你的一些条件,因为它不起作用。我可能可以解决它,但这不是问题(“登录”是您的问题吗?)。所以我测试了代码,它工作正常。注册 -> 登录 -> 如果正确(终止程序)——如果没有(重新登录)。
会员.java
import java.util.HashMap;
import java.util.Map;
public class Member {
private final String username;
private final String password;
private final String firstName;
private static final HashMap<String, String> loginMember = new HashMap<>();
//add a blank constructor so you can call this class for login purposes
public Member(){
this.username = "";
this.password = "";
this.firstName = "";
}
public Member(String username, String password, String firstName) {
this.username = username;
this.password = password;
this.firstName = firstName;
}
//method to access hashmap to another class
public HashMap<String, String> getMemberMap() {
return loginMember;
}
public String getUsername() {
return this.username + "";
}
public String getPassword() {
return this.password + "";
}
public String getFirstName() {
return this.firstName + "";
}
//something wrong with this method here
public boolean isMemberExist(Member member){
if(loginMember.containsKey(member.getUsername()) && loginMember.containsValue(member.getPassword())){
return true;
} else {
System.out.println("No member in the list!");
}
return false;
}
//something also wrong here
public void register(Member member) {
loginMember.put(member.getUsername(),member.getPassword());
}
public void login(Member member){
if(isMemberExist(member)) {
System.out.println("Hello " + member.getFirstName());
} else {
System.out.println("No member with username " +member.getUsername());
}
}
}
Main.java
import java.util.HashMap;
import java.util.Scanner;
public class Main{
private static final Scanner sc = new Scanner(System.in);
private static Member member = new Member("blabla", "blabla", "bla");
public static void main(String[] args) {
boolean exitRequested = false;
while (!exitRequested) {
System.out.println(
"Press: " + "\n" + "\r" + "1.Register" + "\n" + "\r" + "2.Log in" + "\n" + "\r" + "3.Exit.");
int choice = sc.nextInt();
switch (choice) {
case 1:
register();
break;
case 2:
login();
break;
case 3:
exitRequested = true;
break;
default:
System.out.println("?");
break;
}
}
}
public static void register() {
System.out.println("What's your first name?");
String firstName = sc.next();
System.out.println("Please enter username");
String username = sc.next();
System.out.println("Please enter password");
String password = sc.next();
Member newMember = new Member(username, password, firstName);
member.register(newMember);
login(); //call login after registering
}
public static void login() { // here I got stuck I seriously dont know how to continue...
System.out.println("Username:");
String username = sc.next();
System.out.println("Password:");
String password = sc.next();
Member x = new Member(); //call the member class
HashMap<String, String> loginMember = x.getMemberMap(); //access the hashmap
find(loginMember, username, password);
}
//This is just for testing purposes.
public static void find(HashMap<String, String> loginMember, String username, String password) {
for (String i : loginMember.keySet()) {
if (i.equals(username) && loginMember.get(i).equals(password)) {
System.out.println("User is Found!");
System.out.println("Program will now terminate");
System.exit(0);
break;
}
}
System.out.println("User Not Found. Login Again");
login();
}
}
您可能可以自己计算出条件语句。我编辑了注册方法,直接注册,测试登录功能。
答案 1 :(得分:0)
我同意 Gerome Tahud 的观点。
您所做的只是检查用户名和密码是否存在。但是如果我们有两个用户:
user1 (username1, password1, firstName1),
user2 = (username2, password2, firstName2)
在您的 HashMap 中并且用户通知:
username = username1,
password = password2
注册时,你的函数会说这个用户存在,根据你的逻辑,事实并非如此。
另一件会在您的代码中产生错误的事情是,在 isMemberExist(...) 函数中,您调用了 getUserName() 而不是 getUsername( ),Java 不会以相同的方式解释它。