在一个简单的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?
答案 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