在java中,有没有一种方法可以搜索链表中存储的类的特定字段?

在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中的类,该类中有3个字段。其中一个字段是字符串,我想在链表中搜索它

范例

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