我正在尝试根据用户输入找到特定对象。用户要输入名称和性别,然后程序应该搜索ArrayList并查看是否存在匹配的名称和性别。 ArrayList中的对象有3个实例变量,但程序只搜索2.如何在ArrayList中只搜索少数特征?
在我的课程中,我有:
int nameListLength = nameList.size();
.
.
.
boolean done = false;
while (!done) {
System.out.println ("Please enter a name:");
String searchName = input.nextLine();
if (searchName.equals("DONE")) {
done = true;
} else {
System.out.println ("Please enter a gender:");
String searchGender = input.nextLine();
// Search the ArrayList.
for (int i = 0; i < nameListLength; i++) {
// See if the gender is in the ArrayList
if (searchGender.equals(nameList.get(i).getGender())) {
// See if the name matches the gender in the ArrayList
if (searchName.equals(nameList.get(i).getName())) {
System.out.println ("Match found");
}
}
}
}
}
其中nameList是ArrayList的名称,getName()是返回存储在对象中的名称的方法的名称,getGender()是返回存储在对象中的性别的方法的名称。我输入调试语句来确定ArrayList正确地存储信息,我只是在弄清楚如何搜索我正在寻找的东西时遇到了问题。我知道有一个contains(Object o)方法,但我不确定我是否可以在这里实现,因为我只需要匹配对象的2个特征,即使该对象包含3个数据。
答案 0 :(得分:2)
通常你的代码看起来还不错,即使它有点不整洁。你声称它不起作用,但我看不到明显的错误,所以我会仔细检查输入列表和搜索术语(例如案例特殊性)。
不要覆盖等于只能使用包含,因为它意味着你总是要用这两个属性比较你的对象。
您可能会使用新的Stream API,它只有很少的方法可以完全满足您的需求:
List<Yourtype> found = list.stream().filter(u -> u.getName().equals(searchName) && u.getGender().equals(searchGender)).collect(Collectors.toList());
检查是否有匹配的元素
boolean isMath = list.stream().anyMatch(u -> u.getName().equals(searchName) && u.getGender().equals(searchGender));
先进行匹配:
Yourtype match = list.stream().findFirst(u -> u.getName().equals(searchName) && u.getGender().equals(searchGender)).get();
答案 1 :(得分:0)
要使用List。包含方法,您需要在包含数据的对象上实现 equals()方法,以便它可以确定对象是否真的等于另一个对象。
在您的实例中,您将简单地实现3个数据中的2个需要相等,以便equals()方法可以返回true。
答案 2 :(得分:0)
据我了解你的问题,你想根据输入获取匹配的对象。
您已经发布了可行的解决方案。您只需要使用nameList.get(i)获取Object,其中System.out.println(&#34;匹配找到&#34;)就是。
您还可以使用for() - 循环遍历列表中的每个项目,因此您不需要花费很长时间来使用长度。
boolean done = false;
YourObject result;
while (!done) {
System.out.println ("Please enter a name:");
String searchName = input.nextLine();
if (searchName.equals("DONE")) {
done = true;
} else {
System.out.println ("Please enter a gender:");
String searchGender = input.nextLine();
// Search the ArrayList.
for (YourObject item: nameList) {
// See if the gender is in the ArrayList
if (searchGender.equals(item.getGender())) {
// See if the name matches the gender in the ArrayList
if (searchName.equals(item.getName())) {
result = item;
}
}
}
}
}
结果将是您的匹配对象
答案 3 :(得分:0)
Collection.contains()
最终会使用您对象的equals()
和hashCode()
(姓名? - 我在此帖中称之为“)。它会工作如果你写了Name.equals()和Name.hashCode()只使用两个字段,而不是全部三个字段。但是,这可能是不正确的。在其他时间,第三个领域将是重要的。不幸的是,在Java中,你不能即插即用#34;不同的equals()方法。至少,根本不容易。
但是,您可以使用Comparator以及Collections中的实用程序。例如,在Name类中,实现
public static final NAME_AND_GENDER_COMPARATOR = new Comparator<Name>() {
// code goes here
}
然后,调用(您可能希望在nameList的副本上执行此操作,因为它将重新排序)
Collections.sort(nameList, Name.NAME_AND_GENDER_COMPARATOR);
现在,一切都已整理好了。然后拨打
Name searchFor = new Name(theName, theGender); // make a mock Name to search for
int index = Collections.binarySearch(nameList, searchFor, Name.NAME_AND_GENDER_COMPARATOR);
if (index >= 0)
// found it
答案 4 :(得分:0)
in your "Person" object @Override the equals method, then use contains() method from collection.
`@Override
public boolean equals(Object obj) {
final Product other = (Product) obj;
if (obj==null){
return false;}
else if(this.name.equals(other.name) && this.gender.equals(other.gender{
return true;}
else{
return false;}
}`