我认为这很简单,但我需要一种方法来轻松解决它.
我的问题是:我有列表对象学生包含100个对象
public class Student { private String id; private String name; private int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }
现在,我只想让一些学生的年龄有名"ABC","BCD","DEF"
所以我会这样做:
Mapdata = new HashMap<>(); List listSpecification = new ArrayList<>(Arrays.asList("ABC", "BCD", "DEF")); for (Student stu : list ) { for (int i = 0; i < listSpecification.size(); i++) { if (stu.getName().equalsIgnoreCase(listSpecification.get(i))) { data.put(pro.getName(), pro.getValue()); } } }
但如果我这样做,我认为它对性能不好.所以任何人都可以帮我另一个案子?
您的算法具有复杂度O(m*n),其中m是学生数,n是名称数.使用流API的建议或Collection.contains
不会改变.
您可以使用学生姓名中的地图将其转换为O(m + n)算法Student
:
MapstudentsByName = new HashMap<>(); for (Student s : studentList) { studentsByName.put(s.getName().toLowerCase(), s); }
这是O(m)操作.然后,您可以遍历规范列表中的所有名称,将每个名称转换为小写,并直接拉出每个学生.这是O(n)操作.如果您需要为同一学生列表处理多个规范列表,则需要进行一次第一步,这样可以进一步提高效率.