在java中处理ArrayList中的相等性

时间:2016-07-28 03:14:27

标签: java arraylist

说我有这部分代码:

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>();

6 个答案:

答案 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 +

,甚至可以使用流API
accounts.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;
    }
}