我正在努力寻找相关的答案来解决我的问题。我有一个数组列表:
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 */
要扫描教师列表
并查找输入的教师名称(教师名称
)是否匹配,可以使用以下方法之一。请注意,每个方法都将TalerList
和enteredName
作为参数,并返回一个布尔值
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()
方法。此方法指定两个教师对象相等的标准-如果它们的名称相等,则认为教师对象相等。这允许使用equalsList
的contains
方法。
代码:
教师爪哇:
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
在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);
}
}
这取决于您的用例,名称是否区分大小写?此外,您可能需要考虑修剪空间。然后创建一个集合名称集,在其中可以对现有名称执行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,