当前位置: 首页 > 知识库问答 >
问题:

Java-在迭代对象列表时搜索特定属性[重复]

姜森
2023-03-14

我正在努力寻找相关的答案来解决我的问题。我有一个数组列表:

List<Teacher> teacherList = new ArrayList<Teacher>(11);

教师类具有名称属性。我想浏览一下教师列表,看看是否有一个名称与用户输入的名称匹配。

那么比如说,,

Scanner teacherNameScanner = new Scanner (System.in);
System.out.println("What is the teachers name");
teacherName = teacherNameScanner.nextLine();

/* Here I want to scan through the teacherList and see whether the name entered
matches the name of any of the teachers. If it does not match I want to tell the
user to enter a correct name */

共有3个答案

司寇照
2023-03-14

要扫描教师列表并查找输入的教师名称(教师名称)是否匹配,可以使用以下方法之一。请注意,每个方法都将TalerListenteredName作为参数,并返回一个布尔值true或false--取决于是否找到匹配项。

有三种方法,每种方法的性能都不同。注意第三个构造C——它使用的方法与前两个不同——A和B。


方法A:

使用for循环迭代teacherList,查找是否有姓名匹配的教师:

for (Teacher teacher : teacherList) {
    if (teacher.getName().equals(enteredName)) {
        // a match is found
        return true;
    }
}

return false;


方法B:

这与方法A具有相同的功能,但使用不同的代码构造流和lambdas:

boolean enteredTeacherExists =  teacherList.stream()
                                           .anyMatch(teacher -> teacher.getName().equals(enteredName));

语法老师-


方法C:

此方法使用不同的方法。与测试教师姓名不同,教师对象使用输入的名称构造,对象用于查找匹配项。

从输入的名称创建一个教师,并测试它是否存在于列表中。

Teacher enteredTeacher = new Teacher(enteredName);
boolean enteredTeacherExists = teacherList.contains(enteredTeacher);

如果列表中存在同名教师,则返回的值为true,否则为false。

请注意,Teacher类(见下面的定义)有一个java。lang.Object类的重写equals()方法。此方法指定两个教师对象相等的标准-如果它们的名称相等,则认为教师对象相等。这允许使用equalsListcontains方法。


代码:

教师爪哇:

public class Teacher {

    private String name;

    public Teacher(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    /* This returns a string representation of the teacher - the name. */
    public String toString() {
        return name;
    }

    @Override
    public boolean equals(Object other) {
        if ((other != null) && (other instanceof Teacher)) {
            Teacher otherTeacher = (Teacher) other;
            if (otherTeacher.getName().equals(this.name)) {
                return true;
            }
        }
        return false;
    }
}


教师测试员。JAVA

public class TeacherTester {

    public static void main(String [] args) {

        // Create some teachers
        Teacher teacher1 = new Teacher("first");
        Teacher teacher2 = new Teacher("second");
        Teacher teacher3 = new Teacher("third");
        List<Teacher> teacherList = Arrays.asList(teacher1, teacher2, teacher3);

        System.out.println("Teachers: " + teacherList);

        // Look for teacher - using method A
        String enteredName = "ninth";
        System.out.println("A. Found " + enteredName + " : " + findTeacherA(teacherList, enteredName));
        enteredName = "first";
        System.out.println("A. Found " + enteredName + " : " + findTeacherA(teacherList, enteredName));

        // Look for teacher - using method B
        enteredName = "ninth";
        System.out.println("B. Found " + enteredName + " : " + findTeacherB(teacherList, enteredName));
        enteredName = "second";
        System.out.println("B. Found " + enteredName + " : " + findTeacherB(teacherList, enteredName));

        // Look for teacher - using method C
        enteredName = "third";
        System.out.println("C. Found " + enteredName + " : " + findTeacherC(teacherList, enteredName));
        enteredName = "ninth";
        System.out.println("C. Found " + enteredName + " : " + findTeacherC(teacherList, enteredName));     

    }

    private static boolean findTeacherA(List<Teacher> teacherList, String enteredName) {

        for (Teacher teacher : teacherList) {

            if (teacher.getName().equals(enteredName)) {
                // a match is found
                return true;
            }
        }

        return false;
    }

    private static boolean findTeacherB(List<Teacher> teacherList, String enteredName) {

        return teacherList.stream()
                            .anyMatch(teacher -> teacher.getName().equals(enteredName));
    }

    private static boolean findTeacherC(List<Teacher> teacherList, String enteredName) {

        Teacher enteredTeacher = new Teacher(enteredName);
        return teacherList.contains(enteredTeacher);
    }
}


输出:

Teachers: [first, second, third]
A. Found ninth : false
A. Found first : true
B. Found ninth : false
B. Found second : true
C. Found third : true
C. Found ninth : false

庄兴发
2023-03-14

在Java8中,您可以使用流:

public static Teacher findByName(Collection<Teacher> teachers, String name) {
    return teachers.stream().filter(teacher -> teacher.getName().equals(name)).findFirst().orElse(null);
}

此外,如果您有许多不同的对象(不仅仅是Teacher),或者您希望通过不同的属性(不仅仅是name)找到它,您可以构建一个实用程序类,在其中封装此逻辑:

public final class FindUtils {
    public static <T> T findByProperty(Collection<T> col, Predicate<T> filter) {
        return col.stream().filter(filter).findFirst().orElse(null);
    }
}

public final class TeacherUtils {
    public static Teacher findByName(Collection<Teacher> teachers, String name) {
        return FindUtils.findByProperty(teachers, teacher -> teacher.getName().equals(name));
    }

    public static Teacher findByAge(Collection<Teacher> teachers, int age) {
        return FindUtils.findByProperty(teachers, teacher -> teacher.getAge() == age);
    }

}
萧宏峻
2023-03-14

这取决于您的用例,名称是否区分大小写?此外,您可能需要考虑修剪空间。然后创建一个集合名称集,在其中可以对现有名称执行get操作,这是一个O(1)操作。同样,有很多解决方案,除非你描述了确切的用例,比如你是否想用名字或id(通常是id)来识别一个老师——很难找到正确的解决方案。但是使用您描述的HashSet应该做什么。

Set<String> nameSet = new HashSet<String>();

if (nameSet.contains(teacherName))
   do what you want
else
   other case
 类似资料:
  • 我有一个对象的arraylistTile有我想创建一个搜索函数,在这里我迭代遍历瓷砖的每个属性和arraylist中每个颜色内的每个属性(就像每个循环的嵌套),有没有一种简单的方法可以做到这一点?

  • 问题内容: 我有点迷茫,无法做到最快。我有一大堆具有基本变量属性的对象(带有getters / setters方法),我需要在此列表中进行搜索以找到列表中与给定参数匹配的对象 我已经找到了如何进行常规列表搜索的方法,但是我需要进行搜索,例如搜索列表中每个对象的调用getName()的结果的值,并获取结果与我的输入匹配的对象。 如下所示,第三个参数是方法调用的结果,第二个是我要查找的结果。 任何建议

  • 我试图根据用户输入找到一个特定的对象。用户需要输入姓名和性别,然后程序应该搜索ArrayList,查看是否有匹配的姓名和性别。ArrayList中的对象有3个实例变量,但程序只搜索2个。如何在ArrayList中只搜索选定的几个特征? 在我的项目中,我有: 其中,nameList是ArrayList的名称,getName()是返回存储在对象中的名称的方法的名称,getGender()是返回存储在对

  • 如何迭代对象及其子对象的属性?我在中使用了,但无法获取歌曲信息:/

  • 问题内容: 我有一堂课。它具有以下特征; 它具有2个属性,和。1个人可以拥有许多电话,因此您可能会在下面看到具有多个ID的人。 还有另一门课叫。它将有一个称为的方法。 personList,具有3-4个Person对象。我需要搜索PersonArrayList并找到与Person对象匹配的对象。我怎样才能做到这一点? 注意:我尝试过。但这是行不通的。 问题答案: 我尝试了personList.co

  • 问题内容: 假设我正在创建一个简单的类以类似于C样式的结构工作,只保存数据元素。我试图弄清楚如何在对象列表中搜索属性等于某个值的对象。下面是一个简单的示例,以说明我要执行的操作。 例如: 我将如何搜索myList列表以确定它是否包含n == 5的元素? 我一直在谷歌搜索和搜索Python文档,我想我可以通过列表理解来做到这一点,但是我不确定。我可能还要补充一点,我必须使用Python 2.4.3,