我有一个与对象人员的链接列表。
Class person{
int age;
String name;
String address
}
现在,我想检查对象是否包含在列表中。但我的问题是,只有一些领域是相关的。例如,我想检查人员:tony, age 18 是否包含在列表中。
列表支持吗?如果不是,哪种数据结构支持它?
好吧,你可以使用一个简单的循环。
for (int i=0; i<list.size(); i++) {
Person p = list.get(i);
if (p.name.equals("Tony") && p.age == 18) {
//p is the person you were looking for
//do whatever you wanted to do with p
//if you don't want to include duplicate "Tonies" then add a break;
}
}
好吧,您可以将您的人员放入 aList<Person>
并对其进行迭代:
for(Person p : personList){
if ("tony".equals(p.name) && p.age == 18){
//match - do some stuff
;
}
}
列表有contains(obj)
它比较的方法(o==null ? e==null : o.equals(e))
因此,如果您equals
在 Person 类中覆盖方法,并且您可以这样做list.contains(obj)
,它会直接返回 true/false。
你可以像这样检查
ArrayList<Person> persons=new ArrayList<Person>();
检查人员
这样做
for(Person p : persons)
{
if (p.name.equals("Tony") && p.age == 18)
}
此类可以映射到数据库中的表,并且您要执行 select * from person where age > 18。
有两种情况: on is without index:数据库将读取所有值,并将与年龄字段值进行比较,列表也是如此:解析列表元素,你会发现,但这是最慢的方法。
另一种是对搜索的优化:将数据库索引添加到相关字段。在列表中,您可以收集其他数据以加快搜索速度。
例如: LinkedHashSet>indexedByAge
只需询问谁是 18 岁或 18 岁之前,您将得到一系列需要使用 addAll() 方法合并到一个的 ArrayList。
有点乱,但您可以按如下方式覆盖该equals
方法:
class Person
{
int age;
String name;
String address;
Person(int a, String n, String ad) { age = a; name = n; address = ad; };
@Override
public boolean equals(Object o)
{
Person p = (Person)o;
if (p.age != -1 && age != -1 && p.age != age)
return false;
if (p.name != null && name != null && !p.name.equals(name))
return false;
if (p.address != null && address != null && !p.address.equals(address))
return false;
return true;
}
}
我假设-1
并且null
是未初始化的值。
用法:
ArrayList<Person> arr = new ArrayList<Person>();
arr.add(new Person(18,"tony","here"));
System.out.println(arr.contains(new Person(18,"tony",null))); // prints true