Добавление ArrayList в класс - что он делает? - PullRequest
1 голос
/ 20 апреля 2009

Исходя из этого моего вопроса: Какой лучший способ сделать эту Java-программу?

Мне было рекомендовано хранить список в классе лектора и классе курса. Так я и сделал, и выглядит примерно так:

public class Lecturer
{
    private String id;  
    private String name;  
    List<Course> courses = new ArrayList<Course>();  // a list to hold the courses


    public Lecturer(String idIn, String nameIn)     // arguments of the constructor
    {
        id = idIn;
        name = nameIn;

    }

}

То же самое для класса Course, за исключением того, что у него есть список лекторов. Но что я не понимаю, так это то, что делает размещение списка именно там? потому что я не знаю, куда поместить методы ArrayList, такие как добавление и удаление лекторов из него?

Может кто-нибудь объяснить цель этого?

Я использую другой метод, который в основном помещает массивы и его методы в два отдельных класса для лектора и курса, а затем я просто добавляю в класс Курс и Лектора в качестве атрибута, например:

public class Lecturer
{
    private String id;  
    private String name;  
    private CourseList courses;  // COurseList is the class with the arraylist and methods


    public Lecturer(String idIn, String nameIn)     // arguments of the constructor
    {
        id = idIn;
        name = nameIn;
        courses = new CourseList();
    }

}

Надеюсь, у меня есть смысл, потому что последние две недели я застрял на одном, чего, похоже, не понимаю.

Спасибо

Ответы [ 2 ]

1 голос
/ 20 апреля 2009

В первом методе вам необходимо предоставить методы, которые позволяют клиентскому коду добавлять данные в эти списки. Итак, вы могли бы иметь:

public class Lecturer
{
    List<Course> courses = new ArrayList<Course>();  // a list to hold the courses

    public Lecturer(String idIn, String nameIn)
    {
        /* do stuff */
    }

    public void addCourse(Course newCourse)
    {
        this.courses.add(newCourse);
    }
}

Вы можете сделать что-то похожее для курса. После того, как вы их настроите, вы можете сделать что-то вроде этого:

public static void main(String[] args)
{
    Lecturer bob = new Lecturer(1, "Bob Smith");
    Course math = new Course("Math 101");

    // wire them together such that Bob teaches Math 101
    bob.addCourse(math);
    math.addLecturer(bob);
}

Я думаю, что это решает то, что вы спрашиваете, но наличие этих двусторонних, круговых отношений иногда является признаком плохого дизайна. Только вы знаете, какое у вас настоящее задание, поэтому я надеюсь, что это поможет!

0 голосов
/ 20 апреля 2009

Я бы посоветовал использовать Map<Lecturer, List<Course>>, как кто-то ответил на предыдущий вопрос, что означает «связь (Map) между разными лекторами (Lecturer) с перечнем курсов, которые они преподают (* 1004» *) вместо этого, который вы бы создали как new HashMap<Lecturer, List<Course>>. В противном случае, сохраняя список для каждого, вы будете дублировать функциональность.

После того как вы объявили Course s c1, c2, ..., cn a Lecturer l, вы связываете их в Map m как m.put(l, c), где c - это List курсов , объявленный как new LinkedList<Course>() и добавленный как c.add(c1); c.add(c2); ... c.add(cn);.

Если я четко объясню.

Вы можете прочитать http://java.sun.com/docs/books/tutorial/collections/interfaces/map.html и http://java.sun.com/docs/books/tutorial/collections/implementations/map.html для получения дополнительной помощи по использованию Map s.

Чтобы получить обратную связь, вы можете легко использовать следующий код:

Collection<Course> courses = m.values();
Map<Course, List<Lecturer>> reverseAssociation = new HashMap<Course, List<Lecturer>>;

    for (Course course : courses) {
        List<Lecturer> lecturersTeachingCourse = new LinkedList<Lecturer>();

        for (Lecturer lecturer : m.keySet()) {
            if (lecturer.teaches(course)) {
                lecturersTeachingCourse.add(lecturer);
            }
        }

        coursesTaught.put(course, lecturersTeachingCourse);
    }

Если Lecturer.teaches(Course) запрашивает, преподает ли лектор пройденный курс, то reverseAssociation устанавливается как ассоциация курсов-лекторов. (Естественно, вы должны инкапсулировать этот код как метод в лекторах).

Удачи, JavaNoob! Мы все были там однажды!

...