在java中,有没有一种方法可以搜索链表中存储的类的特定字段?
我编写了一个要存储在linkedlist中的类,该类中有3个字段。其中一个字段是字符串,我想在链表中搜索它 范例在java中,有没有一种方法可以搜索链表中存储的类的特定字段?,java,string,search,linked-list,field,Java,String,Search,Linked List,Field,我编写了一个要存储在linkedlist中的类,该类中有3个字段。其中一个字段是字符串,我想在链表中搜索它 范例 LinkedList Obj1 String name = "first"; int age = 2; int size = 4; Obj2 String name = "second"; int age = 3; int size = 6;
LinkedList
Obj1
String name = "first";
int age = 2;
int size = 4;
Obj2
String name = "second";
int age = 3;
int size = 6;
Obj3
String name = "third";
int age = 5;
int size = 8;
如果这是使用给定字段存储这三个对象的linkedlist,是否有方法在链表中搜索名为“second”的对象 您可以通过迭代在列表中搜索项目
// Iterate over each object within the list
for(YourClass obj : yourLinkedList) {
// Check if the object's name matches the criteria, in this case, the name
// of the object has to match "second"
if (obj.name.equals("second")) {
// If we are within this block, it means that we found the object that has
// its name set as "second".
return obj;
}
}
你也可以用一种方法让事情变得更优雅
public YourClass findByName(String name) {
for(YourClass obj : yourLinkedList) {
if (obj.name.equals(name)) {
return obj;
}
}
return null;
}
并按以下方式使用它
YourClass object = findByName("second");
您可以通过迭代在列表中搜索项目
// Iterate over each object within the list
for(YourClass obj : yourLinkedList) {
// Check if the object's name matches the criteria, in this case, the name
// of the object has to match "second"
if (obj.name.equals("second")) {
// If we are within this block, it means that we found the object that has
// its name set as "second".
return obj;
}
}
你也可以用一种方法让事情变得更优雅
public YourClass findByName(String name) {
for(YourClass obj : yourLinkedList) {
if (obj.name.equals(name)) {
return obj;
}
}
return null;
}
并按以下方式使用它
YourClass object = findByName("second");
看看这个界面。您可以编写一个方法,在一个列表上进行迭代,并使用比较器查找您要查找的对象
类似于(未编译):
在比较器中,您可以让它执行您想要的任何比较
以下是一个工作示例:
public class JavaApplication4
{
public static void main(String[] args)
{
final List<Data> list;
final List<Data> a;
final List<Data> b;
list = new ArrayList<Data>();
list.add(new Data("Foo", 1));
list.add(new Data("Bar", 10));
list.add(new Data("Car", 10));
a = find(list,
new Data("Bar", 0),
new Comparator<Data>()
{
@Override
public int compare(final Data o1,
final Data o2)
{
return (o1.name.compareTo(o2.name));
}
});
b = find(list,
new Data(null, 10),
new Comparator<Data>()
{
@Override
public int compare(final Data o1,
final Data o2)
{
return (o1.count - o2.count);
}
});
System.out.println(a.size());
System.out.println(b.size());
}
private static List<Data> find(final List<Data> list,
final Data desired,
final Comparator<Data> comprator)
{
final List<Data> results;
results = new ArrayList(list.size());
for(final Data data : list)
{
if(comprator.compare(desired, data) == 0)
{
results.add(data);
}
}
return (results);
}
private static class Data
{
private final String name;
private final int count;
Data(final String nm,
final int c)
{
name = nm;
count = c;
}
}
}
看看这个界面。您可以编写一个方法,在一个列表上进行迭代,并使用比较器查找您要查找的对象
类似于(未编译):
在比较器中,您可以让它执行您想要的任何比较
以下是一个工作示例:
public class JavaApplication4
{
public static void main(String[] args)
{
final List<Data> list;
final List<Data> a;
final List<Data> b;
list = new ArrayList<Data>();
list.add(new Data("Foo", 1));
list.add(new Data("Bar", 10));
list.add(new Data("Car", 10));
a = find(list,
new Data("Bar", 0),
new Comparator<Data>()
{
@Override
public int compare(final Data o1,
final Data o2)
{
return (o1.name.compareTo(o2.name));
}
});
b = find(list,
new Data(null, 10),
new Comparator<Data>()
{
@Override
public int compare(final Data o1,
final Data o2)
{
return (o1.count - o2.count);
}
});
System.out.println(a.size());
System.out.println(b.size());
}
private static List<Data> find(final List<Data> list,
final Data desired,
final Comparator<Data> comprator)
{
final List<Data> results;
results = new ArrayList(list.size());
for(final Data data : list)
{
if(comprator.compare(desired, data) == 0)
{
results.add(data);
}
}
return (results);
}
private static class Data
{
private final String name;
private final int count;
Data(final String nm,
final int c)
{
name = nm;
count = c;
}
}
}
你可以经历它,完成它,或者有另一种方法 您需要重写类中的equals方法(以及hashcode方法) 重写与所需相等的后,在本例中,要比较名称,请创建一个具有相同名称的新对象,然后调用LinkedList的remove(object o)方法并获取该对象
您应该注意,使用这种方法,您将按名称定义条目,并且该条目将从LinkedList中删除。您可以查看该条目并完成它,或者有其他方法 您需要重写类中的equals方法(以及hashcode方法) 重写与所需相等的后,在本例中,要比较名称,请创建一个具有相同名称的新对象,然后调用LinkedList的remove(object o)方法并获取该对象
您应该注意,使用这种方法,您将按名称定义对象相等,并且该条目将从LinkedList中删除。下面是实现比较器的另一种方法(以防它有所帮助) 我发现,如果显式实现比较器,则更容易理解:
class PersonAgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person person2) {
return p1.getAge().compareTo(p2.getAge());
}
}
类PersonAgeComparator实现Comparator{
@凌驾
公共整数比较(人员p1、人员2){
返回p1.getAge().compareTo(p2.getAge());
}
}
您可以这样使用上面的选项:
Comparator ageComparator = new PersonAgeComparator();
List<Person> personList = // populate list somehow
Person fourYearOld = new Person();
fourYearOld.setAge(4);
for (Person p : personList) {
if (ageComparator.compare(fourYearOld, p) == 0) {
System.out.println(p.getName() + " is 4 years old");
}
}
Comparator ageComparator=newPersonageComparator();
List personList=//以某种方式填充列表
四岁的人=新人();
四岁。胎位(4);
for(个人p:个人列表){
如果(年龄比较器比较(四岁,p)==0){
System.out.println(p.getName()+“是4年前的”);
}
}
对于这个简单的例子来说,这没有多大意义
如果你有几种复杂的方法来比较人们(按身高、调整后的收入、他们居住过的州数等等),那就太理想了 这里是实现比较器的另一种方法(以防万一) 我发现,如果显式实现比较器,则更容易理解:
class PersonAgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person person2) {
return p1.getAge().compareTo(p2.getAge());
}
}
类PersonAgeComparator实现Comparator{
@凌驾
公共整数比较(人员p1、人员2){
返回p1.getAge().compareTo(p2.getAge());
}
}
您可以这样使用上面的选项:
Comparator ageComparator = new PersonAgeComparator();
List<Person> personList = // populate list somehow
Person fourYearOld = new Person();
fourYearOld.setAge(4);
for (Person p : personList) {
if (ageComparator.compare(fourYearOld, p) == 0) {
System.out.println(p.getName() + " is 4 years old");
}
}
Comparator ageComparator=newPersonageComparator();
List personList=//以某种方式填充列表
四岁的人=新人();
四岁。胎位(4);
for(个人p:个人列表){
如果(年龄比较器比较(四岁,p)==0){
System.out.println(p.getName()+“是4年前的”);
}
}
对于这个简单的例子来说,这没有多大意义
如果你有几种复杂的方法来比较人们(按身高、调整后的收入、他们居住过的州数等等),那就太理想了 最简单的方法当然是遍历集合中的每个元素,检查它是否匹配您的筛选条件,然后选择找到的匹配项。但是,这样做会变得单调乏味,需要执行的次数越多,过滤条件就越复杂。我建议利用已有的库来高效地完成任务。下面是一个示例,使用:
final List listObjs=Arrays.asList(
新SomeObj(“第一”,2,4),新SomeObj(“第二”,3,6),
新SomeObj(“第三”,5,8));
final Iterable filtered=Iterables.filter(listObjs,
新谓词(){
@凌驾
公共布尔应用(最终SomeObj obj){
返回“second”.equals(obj.getName());
}
});
用于(最终SomeObj对象:过滤){
系统输出打印项次(obj);
}
显示的代码将选择列表中名称属性为“second”的所有对象。显然,谓词不必是匿名内部类-如果需要重用它,只需将其分解为独立类即可。最简单的方法当然是遍历集合中的每个元素,检查它是否与筛选条件匹配,然后选择找到的匹配项。但是,这样做会变得单调乏味,需要执行的次数越多,过滤条件就越复杂。我建议利用已有的库来高效地完成任务。下面是一个示例,使用:
final List listObjs=Arrays.asList(
新SomeObj(“第一”,2,4),新SomeObj(“第二”,3,6),
新SomeObj(“第三”,5,8));
final Iterable filtered=Iterables.filter(listObjs,
新谓词(){
@凌驾
公共b