我正在使用advance for循环来遍历我的arraylist中的所有对象,其中包含2个数据,如用户名和密码。
目标是允许用户编辑信息。首先,我使用advance for循环循环然后我使用条件检查arraylist中的对象是否是用户想要检查的对象。这是我的实施方式,
std::basic_istream
我能够更改信息,但是我遇到了一个问题,我无法检查用户输入的名称是否可以在对象arraylist中找到并且我已经在网上找到任何信息片段但似乎无法找到任何。我尝试使用迭代器,但迭代器不提供这样的需求。我不能在for循环中放入if条件,因为如果第一个对象不包含这样的信息,它将“触发”。
答案 0 :(得分:0)
如果要快速查找现有用户名,最好将pData中的内容存储在不同的结构中。您可以通过pData迭代一次并为Player创建一个用户名的HashMap,例如HashMap中。
答案 1 :(得分:0)
过去,当我需要找到某个特定类型的东西时,可以通过字符串形式的名称来识别(在你的情况下这是登录名),我使用的是我开发的类。我把它称为库,使用它不仅可以使代码更清晰,还可以解决问题。
我没有包含我的图书馆类的完整代码,只包含您使用所需的部分。随意使用它:
import java.util.ArrayList;
public class Library<E> {
ArrayList<E> data = new ArrayList<E>();
ArrayList<String> name = new ArrayList<String>();
public int size() {
return data.size();
}
public boolean contains(String n) {
return name.contains(n);
}
public int indexOf(String name) {
return name.indexOf(name);
}
public E get(String n) {
return data.get(name.indexOf(n));
}
//returns the object at index i
public E get(int i) {
return data.get(i);
}
public void setName(int i, String n) {
name.set(i, n);
}
public String getName(int i) {
return name.get(i);
}
public void add(String n, E v) {
name.add(n);
data.add(v);
}
}
为了您的使用,您将用库替换pData,您也不需要for循环。它看起来像这样:
Library<Player> pData = new Library<Player>();
String name = Keyboard.readString("Input login name to edit : ");
if(pData.contains(name)) {
Player p = pData.get(name);
//edit the login name, password, etc. here
} else {
System.out.println("Login name does not exist");
}
这个Library类只是一个类似于ArrayList的结构,你可以使用一个字符串形式的名称引用对象,它可以根据用户输入和其他东西而变化,而不是一个集合标识符必须硬编码到你的程序中。
在您的情况下,用户想要编辑特定对象的数据。您尝试这样做的方式,用户键入登录名,然后迭代Player对象的数组列表,并查看Player.loginName(或您的任何值)是否与用户输入的登录名匹配。虽然这很有效,但随着您扩展编程项目,它会变得非常混乱和不方便。它也证明效率低于其他方法。
如果您使用此库类,它将使您的代码更简单,更易于管理。没有必要遍历您的数组列表并单独检查每个Player对象的值。相反,从一开始就根据名称简单地索引Player对象会更容易,也更有效。这样,您不必单独检查每个值,而只需引用此Library类,它将告诉您确切找到所需特定播放器的位置。
这个Library类与库目录非常相似(因此我给它的名称)。在库目录中,您可以查找所需的书籍,并告诉您确切的位置。现在想象一下你自己走过图书馆并分别检查每本书的标题和作者,以便找到你需要的东西。与简单地使用目录相比,它将更加困难和低效。这实际上是这个Library类为您完成的。
要实现它,您无需更改有关播放器或类似内容的任何代码。是的,您可能已经在Player对象中定义了登录名,但这并不一定意味着它不能在第二位定义。有时,让多个地方引用相同的值甚至是个好主意。唯一改变的是你添加到库中的方式,而不是ArrayList。您只需要为对象定义名称。在你的情况下,这看起来像这样:
Player p = new Player(); //or whatever you do to construct a player
//do whatever you do to the Player objects here that you normally would before adding them to the array
pData.add(p.loginName, p);
Then when you look for the player you need, simply:
Player p = pData.get(name); //name being the string input from the user
此外,当您更改播放器的登录名时,您还必须更新其在库中的条目(请注意,这只需要在登录名时完成,因为密码和其他数据不会影响条目在图书馆)。这看起来像这样:
//code to change login name of the player
//please note that oName is the original login name of the player before it was modified, NOT the new login name
int i = pData.indexOf(oName); //index of the player that was just modified
pData.setName(i, p.loginName); //p is the Player object