说我有这部分代码:
for(int i = 0; i < accounts.size(); i++) {
if(UserID.equals(accounts.get(i).getUserID())) {
if(accounts.contains(accounts.get(i))) {
if(UserPass.equals(accounts.get(i).getPassword())) {
System.out.println("True");
}
} else {
typePhrase("unrecognised userID: '" + UserID + "'");
}
} else {
typePhrase("unrecognised userID: '" + UserID + "'");
}
}
它通过一个填充了对象的arrayList,它们具有ID和密码。我从用户那里得到两个输入,一个是userID,另一个是密码。我想要的是它遍历那个arrayList中保存的每个可能的对象,如果它找到匹配,打印true
到控制台,我遇到的问题是,如果你输入的东西错误,它会打印一条消息,表明它对于arrayList中的每个对象都是无法识别的。如果在右侧键入一个对象,它还会为arrayList -1中的每个对象打印消息。你有什么建议我做的?
用户类:
public class User {
String userID;
String password;
public User(String ID, String Pass) {
userID = ID;
password = Pass;
}
public String getUserID() {
return userID;
}
public String getPassword() {
return password;
}
}
编辑:
ArrayList<User> accounts = new ArrayList<User>();
答案 0 :(得分:5)
您应该在User类中实现equals方法:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if (!getUserID().equals(user.getUserID())) return false;
return getPassword().equals(user.getPassword());
}
然后,您可以使用键入的信息创建一个新用户,并检查该列表是否包含此用户:
User user = new User("typedUserId", "typedPassword");
System.out.println(accounts.contains(user));
答案 1 :(得分:1)
这是我看到的新程序员经常犯的错误。您正在搜索列表以查看是否有任何元素符合某些条件(例如ID和密码匹配)。如果没有元素满足条件,则执行指示错误的操作。
但是在你完成列表的每个元素之前,你无法判断是否存在错误。因此,任何错误消息都必须在 完成完成之后发生,对吗?不在循环的中间。但是你已经把你的“无法识别的”消息放在循环的中间。那不行。
有几个常见的习惯用来解决这个问题,但这里有一个简单的习惯用法:
boolean found = false;
for (whatever-your-loop-should-look-like) {
if (the-current-element-meets-the-condition) {
found = true;
break;
}
}
if (!found) {
whatever-action-you-take-when-it-isn't-found;
}
答案 2 :(得分:0)
删除此检查...当您遍历这些对象以检查当前对象是否在其来自的对象列表中时,没有任何意义。
if(accounts.contains(accounts.get(i))) {
如果没有这个,当用户ID和密码匹配时,您的代码会打印True(但会继续检查列表的其余部分)。否则,将打印另一条消息。如果要在打印True时停止循环,请将break
放在那里。
要解决此问题,User.equals()
未实现,因此使用了比较对象的默认方式(通过哈希码方法)。
您应该实现它来比较userID和password的相等性。
答案 3 :(得分:0)
不确定在此处实施equals()
是否明智。但是,这并不是你想要做的事情那么简单:
boolean found = false;
for (User u : accounts) {
if (userId.equals(u.getUserId()) && userPass.equals(u.getPassword()) {
found = true;
break;
}
}
如果您使用的是Java 8 +
,甚至可以使用流APIaccounts.stream().anyMatch(u -> userId.equals(u.getUserId())
&& userPass.equals(u.getPassword());
答案 4 :(得分:0)
您可以使用是否找到匹配来保留布尔变量,而不是打印true或找不到。
boolean found = false
for each value in the array
if it's a match set found to true
if it's not a match do nothing, i.e. continue to next position
if (found) print "true" else print "not found"
如果找到匹配项,您也可以突破循环,无需继续检查更多匹配项。
boolean found = true
for each value in the array
if it's a match set found to true and break out of loop
if it's not a match do nothing, i.e. continue to next position
if (found) print "true" else print "not found"
更好的是,您可以将代码移动到返回布尔值并删除变量的方法。
boolean isThereAMatch() {
for each value in the array
if it's a match set return true
if it's not a match do nothing, i.e. continue to next position
return false
}
您可以调用它来检查要打印的内容。
if (isThereAMatch()) print "true" else print "not found"
答案 5 :(得分:0)
您是否正在努力使用List
的{{3}}或使用简单的for循环。它可以通过两种方式完成,下面是两者的代码示例。要使用包含内容,您必须向User
添加contains()重写方法。
来自List.contains()
文档
如果此列表包含指定的元素,则返回true。更正式地,当且仅当此列表包含至少一个元素e时才返回true(o == null?e == null:o.equals(e))。
使用For循环
import java.util.*;
public class TestMain {
public static void main (String[] args) {
List<User> accounts = new ArrayList<User>();
User user1 = new User("test", "test");
User user2 = new User("test1", "test1");
accounts.add(user1);
accounts.add(user2);
String userId = "test";
String userPass = "test1";
boolean matchFound = false;
for(User account : accounts) {
if(userId.equals(account.getUserID()) && userPass.equals(account.getPassword())) {
System.out.println("True");
matchFound = true;
}
}
if(!matchFound) {
System.err.println("unrecognised userID: '" + userId + "'");
}
}
}
class User {
String userID;
String password;
public User(String ID, String Pass) {
userID = ID;
password = Pass;
}
public String getUserID() {
return userID;
}
public String getPassword() {
return password;
}
}
使用contains()和equals()
import java.util.*;
public class TestMain2 {
public static void main (String[] args) {
List<User> accounts = new ArrayList<User>();
User user1 = new User("test", "test");
User user2 = new User("test1", "test1");
accounts.add(user1);
accounts.add(user2);
String userId = "test1";
String userPass = "test1";
boolean matchFound = accounts.contains(new User(userId, userPass));
if(!matchFound) {
System.err.println("unrecognised userID: '" + userId + "'");
} else {
System.out.println("True");
}
}
}
class User {
String userID;
String password;
public User(String ID, String Pass) {
userID = ID;
password = Pass;
}
public String getUserID() {
return userID;
}
public String getPassword() {
return password;
}
@Override
public boolean equals(Object user) {
boolean isEqual = false;
if(user != null && user instanceof User) {
User userType = (User)user;
boolean userIdMatched = (userID == null) ? userType.getUserID() == null : userID.equals(userType.getUserID());
boolean passwordMatched = (password == null) ? userType.getPassword() == null : password.equals(userType.getPassword());
isEqual = userIdMatched && passwordMatched;
}
return isEqual;
}
}