在ArrayList Java中搜索特定对象

时间:2015-04-08 21:01:34

标签: java search arraylist

我正在尝试根据用户输入找到特定对象。用户要输入名称和性别,然后程序应该搜索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个数据。

5 个答案:

答案 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;}
}`