从 List<Student> 中获取具有匹配名称的学生对象而不进行迭代(Java)

Posted

技术标签:

【中文标题】从 List<Student> 中获取具有匹配名称的学生对象而不进行迭代(Java)【英文标题】:Fetch Student object from List<Student> with matching name without iterating (Java) 【发布时间】:2015-11-05 21:28:29 【问题描述】:

我有一个List&lt;Student&gt;String firstName="George"。我想从与"George" 匹配的列表中提取学生对象而不迭代列表。有可能吗?

可能需要某些方法覆盖或任何使其工作的方法。

public Class Student 
     private String firstName;
     private String lastName;
     private String class;

     // getter, setter methods goes here....

请帮帮我,谢谢。

【问题讨论】:

使用Map。其他任何事情都是以某种方式迭代的一种形式 你尝试过什么吗? Java List.contains(Object with field value equal to x) 的可能重复项 @madprogrammer 是对的。你需要一个Map<String, Student>。 不能使用List 【参考方案1】:

如果您使用的是 Java 8,那么可以使用 Stream 和 Lambda:-

List<Student> myStudent = studentsList.stream()
                                      .filter(s -> s.name.equals("George"))
                                      .collect(Collectors.toList());

【讨论】:

从技术上讲,它仍然是一种迭代形式 如果我们有一个列表,除了迭代搜索特定对象之外别无他法。我们能做的最好的事情就是让您的搜索更有效率。 然后对列表进行排序并使用某种二进制搜索:P 或使用Map【参考方案2】:

您应该使用哈希映射而不是 List ,并将学生姓名添加为对象的键。 HashMap=新的HashMap;

【讨论】:

【参考方案3】:

你可以重写 equal() 方法 然后用 firstname="George" 创建一个 Student 对象 当你这样做时,你可以使用 list.indexOf(Student_object) 方法来找出该对象的位置,你可以使用 list.get(index) 来获取列表中的学生对象

【讨论】:

但是你不能使用list.indexOf("George") 并且在内部,它仍然是一种迭代形式 我的意思是创建新对象 Student 并且 setFirstname 是“George”。有了这个,至少我们不必使用循环 我知道你的意思,但我有理由确定这不是 OP 在内部寻找的东西,它仍在使用某种迭代。 Map 将是唯一不需要在另一个级别进行某种形式的迭代的解决方案,只是说;) 这就是我实现的方式,我认为无需创建新的 Student().setFirstName("George") 就可以通过 .contains("George") 实现。感谢您的所有回复。【参考方案4】:

不,您必须迭代.. list 就是这样。如果你想在 O(1) 中进行检索,那么你需要一张地图。

【讨论】:

以上是关于从 List<Student> 中获取具有匹配名称的学生对象而不进行迭代(Java)的主要内容,如果未能解决你的问题,请参考以下文章

从Hashmap的所有值中获取所有嵌套项

从excel表格读取数据用Java代码实现批量上传写入数据库

java ArrayList 如何读取文件中的数据,并且搜索

SPRINGMVC,JSP页面接收到后台传过来的list<Student>类型的数据,如何将其遍历并赋值

list 根据某个字段分组

PAT (Advanced Level) 1039. Course List for Student (25)