Java Arraylist类(自定义数据类型),如何使用contains

时间:2016-10-18 20:47:48

标签: java arraylist contains

在一个简单的ArrayList中,我可以使用像这样的包含:

ArrayList<String> names = new ArrayList<String>();
names.add("John");
names.add("Peter");
String find = "Peter";
if (names.contains(find)) 
System.out.println("I FOUND IT");

但如果我有一个类的ArraList(自定义数据类型),我如何使用contains(或类似的东西)?

public class Person {
   public String name;
   public int age;

   public Person(String name, int age) {
    this.name= name;
    this.age= age;
}

public String getName() {
    return this.name;
}
public String getAge() {
    return this.age;
}
}
ArrayList<Person> somePerson = new ArrayList<Person>();
somePerson.add(new Person("John","25"));
somePerson.add(new Person("Peter","84"));

我如何在这个ArrayList中找到名称&#34; Peter&#34;,或者仅仅是&#34; 84&#34;? 我使用循环和

if (somePerson.get(i).getName().contains(find))

但是有没有循环的方法,比如上面的简单ArrayList?

2 个答案:

答案 0 :(得分:0)

引用https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html

  

集合框架接口中的许多方法都是用术语定义的   equals方法。例如,规范   contains(Object o)方法说:“当且仅当这个时,返回true   集合包含至少一个元素e,使得(o == null?   e == null:o.equals(e))。“
  [...]   实现可以自由实施   例如,避免等于调用的优化   首先比较两个元素的哈希码。 (该   Object.hashCode()规范保证了两个对象   不等的哈希码不能相等。)

换句话说,您的自定义类需要根据这些方法的契约实现equals()和hashCode()方法,这些方法声明相等的对象应该具有相同的哈希码。 (但是相等的哈希码并不一定意味着对象是相等的,尽管应该避免使用容易导致这种冲突的实现。)

答案 1 :(得分:0)

你必须在Person类中覆盖equals方法,如下所示:

public class Person {
   public String name;
   public int age;

   public Person(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public Person(String name) {
       this.name = name;

   }

   public Person(int age) {
       this.age = age;

   }

   public String getName() {
    return this.name;
   }

   public int getAge() {
    return this.age;
   }

   @Override
   public boolean equals(Object other) {
      if (!(other instanceof Person)) {
        return false;
      }

      Person p = (Person) other;
      try {
         return this.name.equals(p.name) || this.age == p.age;
      } catch (Exception e) {
        return this.age == p.age;
      }

   }

    @Override
    public String toString() {
       return name + " " + age;
    }
}

这是主要代码

import java.util.ArrayList;
import org.apache.commons.lang3.ArrayUtils;

public class MainDemo {

public static void main(String[] args) {
    ArrayList<Person> somePerson = new ArrayList<Person>();
    Person person1 = new Person("John", 25);
    Person person2 = new Person("Peter", 84);

    somePerson.add(person1);
    somePerson.add(person2);


    System.out.println("Is John there?: "+ somePerson.contains(new Person("John")));  // true
    System.out.println("Is Paul there?: "+ somePerson.contains(new Person("Paul")));  // false
    System.out.println("Is age 84 (Peter) there?: "+ somePerson.contains(new Person(84))); //true
    System.out.println("Is there a person with age 9 ?: "+ somePerson.contains(new Person(9))); //false


    searchPersonByName(somePerson, "Peter");
    searchPersonByName(somePerson, "John");
    searchPersonByName(somePerson, "Paul"); // not found

    searchPersonByAge(somePerson, 25); // will print  John 25
    searchPersonByAge(somePerson, 84); //will print Peter 84
    searchPersonByAge(somePerson, 102); // not found


}

public  static void searchPersonByName(ArrayList<Person> personsList, String name){

    Person[] personArray = personsList.toArray(new Person[personsList.size()]); // converting arrayList to Array

    String str = personsList.contains(new Person(name))?personsList.get(ArrayUtils.indexOf(personArray, new Person(name))).toString():"Not found";
    System.out.println(str);
}

public static void searchPersonByAge(ArrayList<Person> personsList, int age){
    Person[] personArray = personsList.toArray(new Person[personsList.size()]);

    String str = personsList.contains(new Person(age))?personsList.get(ArrayUtils.indexOf(personArray, new Person(age))).toString():"Not found";
    System.out.println(str);

}


}

这里有输出:

Is John there?: true
Is Paul there?: false
Is age 84 (Peter) there?: true
Is there a person with age 9 ?: false
Peter 84
John 25
Not found
John 25
Peter 84
Not found