从列表中获取一些值<;对象>;JAVA

从列表中获取一些值<;对象>;JAVA,java,string,list,Java,String,List,我认为这很简单,但我需要一个简单的解决方法 我的问题是:我有一个包含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() {

我认为这很简单,但我需要一个简单的解决方法

我的问题是:我有一个包含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”

所以我会这样做:

Map<String, String> data = new HashMap<>();
    List<String> listSpecification = new ArrayList<>(Arrays.asList("ABC", "BCD", "DEF"));
    for (Student stu : list<Student>) {
        for (int i = 0; i < listSpecification.size(); i++) {
            if (stu.getName().equalsIgnoreCase(listSpecification.get(i))) {
                data.put(pro.getName(), pro.getValue());
            }
        }
    }
Map data=newhashmap();
List listSpecification=newarraylist(Arrays.asList(“ABC”、“BCD”、“DEF”));
学生名单(学生名单){
对于(int i=0;i

但如果我这样做,我认为这对性能不好。因此,任何人都可以帮我另一个例子吗?

基本上你没有什么选择,你需要将
学生的
列表中的每个元素与
列表规范中的每个值进行比较


您可以使用
listSpecification.contains(stu.getName())
,但您需要保证大小写要求(可能是将所有内容都大写)

另一种方法是利用Java8中提供的新的
API

List<String> listSpecification = new ArrayList<>(Arrays.asList("ABC", "BCD", "DEF"));

List<Student> students = new ArrayList<>();
students.add(new Student("0", "ABC", 0));
students.add(new Student("1", "XYZ", 0));
students.add(new Student("2", "HIJ", 0));
students.add(new Student("3", "LMN", 0));
students.add(new Student("4", "OPQ", 0));
students.add(new Student("5", "BCD", 0));
students.add(new Student("6", "EFG", 0));
students.add(new Student("7", "HIJ", 0));
students.add(new Student("8", "DEF", 0));
students.add(new Student("9", "STY", 0));

List<Student> matches = students.stream().filter((Student t) -> listSpecification.contains(t.getName())).collect(Collectors.toList());
System.out.println(matches);
List listSpecification=newarraylist(Arrays.asList(“ABC”、“BCD”、“DEF”));
List students=new ArrayList();
添加(新学生(“0”,“ABC”,0));
添加(新学生(“1”,“XYZ”,0));
添加(新学生(“2”,“HIJ”,0));
添加(新学生(“3”,“LMN”,0));
添加(新学生(“4”,“OPQ”,0));
添加(新学生(“5”,“BCD”,0));
添加(新学生(“6”,“EFG”,0));
添加(新学生(“7”,“HIJ”,0));
添加(新学生(“8”,“DEF”,0));
添加(新学生(“9”,“STY”,0));
列表匹配项=students.stream().filter((Student t)->listSpecification.contains(t.getName()).collect(Collectors.toList());
System.out.println(匹配项);
但是,同样,您需要确保
字符串
大小写匹配(可能通过将
列表规范
全部大写并使用
t.getName().toUpperCase()

效率更高吗?我怀疑,但你必须认真比较才能确定


另一种技术可能是构建一系列的
映射
,例如,将特定值(如名称)键入
学生的实例,但您需要为整个问题提供更多的上下文,以了解是否值得付出努力

您的算法具有O(m*n)的复杂性其中m是学生人数,n是姓名人数。使用流式API或
Collection.contains的建议不会改变这一点

您可以使用从学生姓名到
学生的映射,将其转换为O(m+n)算法:

Map<String, Student> studentsByName = new HashMap<>();
for (Student s : studentList) {
    studentsByName.put(s.getName().toLowerCase(), s);
}
Map studentsByName=newhashmap();
对于(学生s:学生名单){
studentsByName.put(s.getName().toLowerCase(),s);
}

这是一个O(m)操作。然后你可以迭代规范列表中的所有名称,将每个名称转换为小写,并直接取出每个学生。这是一个O(n)操作。如果需要为同一个学生列表处理多个规范列表,则只需执行第一步一次,这样可以进一步提高效率。

listSpecification.contains(stu.getName())
-但您需要更正以下链接中的案例用法。变量是什么?
pro
?我会尝试并尽快响应。谢谢,在我获得map studentsByName后。我必须使用2次for loop来获得我想要的列表学生?这是正确的还是我遗漏了什么?@QuangTV-使用这种方法,您可以循环一次学生来构建地图。然后使用第二个循环遍历规范中的名称。在按名称映射学生之后,只需循环一次(对于每个规范列表)。