【问题标题】:Modify a List's class members without knowing the names在不知道名称的情况下修改 List 的类成员
【发布时间】:2016-03-11 13:30:25
【问题描述】:

我想要什么我的头衔可能不清楚,但我有一个程序,用户可以在其中创建学生(包括姓名、年龄和程序)。在 Main() 中,用户会收到问题提示,可以查看当前学生并添加新学生。我想添加修改现有学生的选项,但我不知道创建后如何引用他们。

我有什么 在这里我创建了一个空列表:

public static List<Student> populate(){
    List<Student> students = new ArrayList<Student>();
    return students;    
}

当用户想要添加学生时,main会循环调用此方法。

public static void addStudents(List<Student >students){
    int Answer = 1;
    while ( Answer == 1){
        Scanner reader = new Scanner(System.in);
        //not shown: user enters student's name (NewName) age (NewAge) and program (NewProgram)

        Student nextStudent = new Student(NewName);
        students.add(nextStudent);
        nextStudent.age = NewAge;
        nextStudent.program = NewProgram;   

        System.out.println("Do you want to add another student? Press 1 for yes and 2 for no.");
        Answer = reader.nextInt();

    }
}

我所知道的

知道姓名后,我就知道如何更改学生的属性。例如,当我创建一个学生并添加他的年龄时,我写 nextStudent.age = NewAge; 然而,由于在填充我的列表后,他们都被称为NextStudent,我不知道如何选择一个特定的学生并改变他们的属性了。

【问题讨论】:

  • students.get(&lt;some int in the range 0..students.size()-1&gt;).age = NewAge;
  • “但是,自从填写我的列表后,他们都被称为 NextStudent”是什么意思?错误可能在于您询问名称的方式。另请注意,您应该将 Scanner 结构移到循环之外 - 现在是开始遵循 Java 命名约定的好时机。
  • 维护一个以名称为键的地图(Map&lt;String, Student&gt;)并按名称选择它们。
  • @Andy Turner .get 我想会起作用,但是用户应该如何知道哪个学生是哪个int?我应该简单地让所有学生都用他们旁边的整数命名吗?
  • 遍历列表,寻找具有特定名称的Student 实例。

标签: java list class


【解决方案1】:

您首先需要编写一个方法,该方法将从列表中返回一个匹配名称(或其他任何内容)的学生对象,例如

public Student findByName(List<Student> students, String name){
    for(Student student : students){
        if(student.getName().equals(name)){
            return student;
        }
    }
    return null;
}

完成此操作后,您可以从假设editStudent() 方法调用此方法,如果它返回object(即not null),您可以执行student.setName(""),这将更改名称。 如果它返回 null,那么您可以只显示一条消息“找不到同名的学生”。

【讨论】:

  • 虽然这可行,但每次遍历列表以检索特定学生在算法上效率低下。对于这种需要按名称检索的简单情况,您可以使用 HashMap 而不是列表,对于更复杂的情况,您可以维护单独的索引以快速检索学生。 (尽管一旦您想开始持久化学生数据,您可能可以将该任务委托给您的数据存储层,无论是适当的数据库还是其他解决方案)
  • 不是你应该如何在现实世界的应用程序中做到这一点。没有理由不使用 Map,这可能会将搜索时间减少到 O(1) 时间。
  • 我建议这个解决方案假设名称将由用户提供。现在,它可能不匹配大小写,它可能在开头或结尾有一个空格,这将使映射键实现无用。此外,拥有这样的方法使我们能够对名称(或任何其他属性)执行智能搜索。
  • Map&lt;String, String&gt; nodeMap = new TreeMap&lt;String, String&gt;(String.CASE_INSENSITIVE_ORDER);
  • 开头或结尾留个空格怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 2016-12-03
  • 2016-06-16
相关资源
最近更新 更多