创建一个输出为2种类型的ArrayList

时间:2016-11-30 08:42:26

标签: java arrays oop arraylist

尝试创建一个创建讲座和会谈的Event ArrayList。我不知道如何输出ArrayList来在两者之间进行排序。如果eventChoice = 1,则在下面看到它创建一个Talk,如果是2个讲座。

if(eventChoice == 1){
                        System.out.println("Enter the title of the talk: "); 
                        title = scnr.nextLine();
                        System.out.println("\n"); 

                        System.out.println("Enter the start time"); 
                        System.out.println("Hour (0-23)"); 
                        int hour = scnr.nextInt(); 
                        System.out.println("Minute (0-59"); 
                        int minute = scnr.nextInt();

                        System.out.println("Enter duration"); 
                        int duration = scnr.nextInt();

                        Time startTime = new Time(hour,minute);
                        Time endTime = new Time((startTime.getHour() + duration/60), (startTime.getMinute() + duration%60));
                        Event e1 = new Event(title, startTime, endTime);
                        events.add(e1);
                    }

                    else if(eventChoice == 2){
                        System.out.println("Enter the title of the lecture: "); 
                        title = scnr.nextLine();
                        System.out.println("\n"); 

                        System.out.println("Enter the start time"); 
                        System.out.println("Hour (0-23)"); 
                        int hour = scnr.nextInt(); 
                        System.out.println("Minute (0-59"); 
                        int minute = scnr.nextInt();
                        int duration = 60;
                        Time startTime = new Time(hour,minute);
                        Time endTime = new Time((startTime.getHour()), (startTime.getMinute() + duration));
                        Event e1 = new Event(title, startTime, endTime);
                        events.add(e1);
                    }

然后在我的活动课中我有

@Override
public String toString(){
            return String.format (": "+  getTitle()+ " ("+ getStartTime() + " to "+ getendTime() + " )");
       }
}

我想知道在getTitle()之前我可以使用什么方法输出具有事件类型的数组如果我尝试在选项中定义类型,则输出为null。

2 个答案:

答案 0 :(得分:1)

您的问题是错误建模。如果您有不同的事件类型,那么请不要使用单个公共类来表示这些类型!

相反:创建一个基类Event,提供处理标题,开始和结束时间的方法。

然后创建特定的子类来处理那些需要不同处理的事物。

背后的设计原则称为"Tell don't Ask":在OO编程中,您很少/从不查询某个对象的内部状态然后做出决策。相反,你只需在该对象上调用一些方法。

在你的情况下,这意味着你有Talk和Lecture的子类,它们带有不同的toString()方法。

最后:使用int和switch来确定事件类型也是不好的做法。至少:使用一些java 枚举而不是整数!

答案 1 :(得分:1)

Event课程中,添加另一个名为type的字段,并为其添加一个getter:

private EventType type;
public EventType getType() {
    return type;
}

其中EventType被声明为:

public enum EventType {
    Talk, Lecture
}

在构造函数中添加type的初始化:

                 add this
                   |
                   V
public Event(EventType type, String title, Time startTime, Time endTime) {
    this.type = type; // <---- and this
    // ...
}

toString方法更改为:

@Override
public String toString(){
    return getType() + ": "+  getTitle()+ " ("+ getStartTime() + " to "+ getendTime() + " )");
}

您的代码应如下所示:

if(eventChoice == 1){
    System.out.println("Enter the title of the talk: ");
    title = scnr.nextLine();
    System.out.println("\n");

    System.out.println("Enter the start time");
    System.out.println("Hour (0-23)");
    int hour = scnr.nextInt();
    System.out.println("Minute (0-59");
    int minute = scnr.nextInt();

    System.out.println("Enter duration");
    int duration = scnr.nextInt();

    Time startTime = new Time(hour,minute);
    Time endTime = new Time((startTime.getHour() + duration/60), (startTime.getMinute() + duration%60));
    Event e1 = new Event(EventType.Talk, title, startTime, endTime);
    events.add(e1);
}

else if(eventChoice == 2){
    System.out.println("Enter the title of the lecture: ");
    title = scnr.nextLine();
    System.out.println("\n");

    System.out.println("Enter the start time");
    System.out.println("Hour (0-23)");
    int hour = scnr.nextInt();
    System.out.println("Minute (0-59");
    int minute = scnr.nextInt();
    int duration = 60;
    Time startTime = new Time(hour,minute);
    Time endTime = new Time((startTime.getHour()), (startTime.getMinute() + duration));
    Event e1 = new Event(EventType.Lecture, title, startTime, endTime);
    events.add(e1);
}