假设我有这段代码:
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 + "'");
}
}
它通过一个数组列表,该列表中充满了具有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>();
您应该在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));
这是我看到新程序员经常犯的错误。您正在搜索列表,以查看是否有任何元素符合某些条件(例如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;
}
删除此检查。。。当您在这些对象上循环以检查当前对象是否在其来源的对象列表中时,这是没有意义的。
if(accounts.contains(accounts.get(i))) {
如果没有这一点,当userID和密码匹配时,代码将打印True(但继续检查列表的其余部分)。否则,将打印另一条消息。如果要在打印True时停止循环,请将break
放在那里。
然而,为了解决这个问题,没有实现User.equals()
,因此使用了比较对象的默认方式(通过hashcode方法)。
您应该实现它来比较userID和密码的相等性。
不确定在这里实现equals()
是否是明智的选择。然而,这不是你想要做的简单的事情吗:
boolean found = false;
for (User u : accounts) {
if (userId.equals(u.getUserId()) && userPass.equals(u.getPassword()) {
found = true;
break;
}
}
如果你使用的是Java 8+,你甚至可以使用流API
accounts.stream().anyMatch(u -> userId.equals(u.getUserId())
&& userPass.equals(u.getPassword());
无论是否找到匹配项,您都可以保留一个布尔变量,而不是打印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"
您正在纠结是使用List
的contains()还是使用简单的for循环。这两种方法都可以实现,下面是这两种方式的代码示例。要使用contains,您必须向User
添加一个equals()重写的方法。
来自List.contains()
文档
如果此列表包含指定的元素,则返回true。更正式地说,当且仅当该列表包含至少一个元素e,使得(o==null?e==null:o.equals(e))时,返回true。
带For Loop
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;
}
}