从List <object> Java中获取一些值

时间:2015-12-04 05:00:18

标签: 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() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}

现在,我只想让一些学生的年龄得到名字&#34; ABC&#34;,&#34; BCD&#34;,&#34; DEF&#34;

所以我会这样做:

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());
            }
        }
    }

但如果我这样做,我认为它对表现并不好。所以任何人都可以帮助我另一个案例?

2 个答案:

答案 0 :(得分:5)

您的算法具有复杂度O(m * n),其中m是学生数,n是名称数。使用流API或Collection.contains的建议不会改变它。

您可以使用从学生姓名到Student的地图将此转换为O(m + n)算法:

Map<String, Student> studentsByName = new HashMap<>();
for (Student s : studentList) {
    studentsByName.put(s.getName().toLowerCase(), s);
}

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

答案 1 :(得分:2)

基本上你别无选择,你需要将Student List中的每个元素与listSpecification List中的每个值进行比较。

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

另一种方法可能是使用Java 8中提供的新Stream 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);

但是,您需要确保String案例匹配(可能将listSpecification全部大写并使用t.getName().toUpperCase()

效率更高吗?我怀疑它,但你必须进行一些严肃的比较才能确定。

另一种技术可能是构建一系列Map,它们将某些值(如名称)键入Student的实例,但是您需要提供更多关于整体问题的背景知道是否值得付出努力