好的,这是我对这个问题的看法:
首先,数组并不是这里最好的数据结构。不要使用数组索引来表示应用程序域数据。数组非常适合表示相同项目的复制。如果需要 start 和 end 然后使用“start”和“end”变量,不要使用索引 0 和 1 来表示。
其次,如果您需要记录和比较日期/时间,有内置的 java 类可以做到这一点。所以使用它们。这包括诸如时间间隔、星期几枚举等概念
所以我的解决方案如下
1) 创建一个数据结构来保存单向的开始结束记录时间。这是计算持续时间的地方:
import java.time.*;
import java.time.format.DateTimeFormatter;
// records start and end times for one direction
public class RecordedTrack {
public LocalTime start;
public LocalTime end;
public RecordedTrack (LocalTime start, LocalTime end) {
this.start = start;
this.end = end;
}
// accept String times in "HH:MM:SS" format
public RecordedTrack (String start, String end) {
this(
LocalTime.parse(start, DateTimeFormatter.ISO_LOCAL_TIME),
LocalTime.parse(end, DateTimeFormatter.ISO_LOCAL_TIME));
}
public Duration getDuration() {
return Duration.between(start, end);
}
// return String times in "MM:SS" format
public String getDurationStr () {
long seconds = getDuration().getSeconds();
return String.format("%02d:%02d", (seconds % 3600) / 60, seconds % 60);
}
}
2) 创建一个数据结构来保存两个方向的完整行程:
// records start and end times for complete two directions itinerary
public class RecordedItinerary {
public RecordedTrack AtoB;
public RecordedTrack BtoA;
public RecordedItinerary (RecordedTrack AtoB, RecordedTrack BtoA) {
this.AtoB = AtoB;
this.BtoA = BtoA;
}
}
3) 创建一个数据结构来保存与一个人相关的所有数据。我假设一个人有一个名字来与其他人区分开来,并每天进行一次体育锻炼。如果需要,可以修改:
// records weekly itineraries of one person
public class Person {
public String name;
public RecordedItinerary[] weeklyItineraries = new RecordedItinerary[DayOfWeek.values().length+1];
public Person (String name) {
this.name = name;
}
// add an itinerary of given day-of-week
public void addDailyItinerary(DayOfWeek dow, RecordedItinerary itinerary) {
weeklyItineraries[dow.getValue()] = itinerary;
}
// add today's itinerary
public void addDailyItinerary(RecordedItinerary itinerary) {
addDailyItinerary(LocalDateTime.now().getDayOfWeek(), itinerary);
}
// get an itinerary of given day-of-week
public RecordedItinerary getDailyItinerary(DayOfWeek dow) {
return weeklyItineraries[dow.getValue()];
}
// get today's itinerary
public RecordedItinerary getDailyItinerary() {
return getDailyItinerary(LocalDateTime.now().getDayOfWeek());
}
// a person is identified by his/her name
// will throw ClassCastException if arg is not a Person
@Override
public boolean equals(Object o) {
return this.name.equals(((Person)o).name);
}
}
4) 现在您可以根据输入创建Person 实例。您需要将它们保存在地图或您喜欢的任何数据结构中。下面是一个展示系统工作原理的测试程序:
public class RecordingTimesSystem {
public static void main(String... args) {
// new person!
Person john = new Person("John Doe");
// add today's two-direction itinerary
john.addDailyItinerary(
new RecordedItinerary(
new RecordedTrack("07:10:00", "07:20:30"), // a-to-b recorded times
new RecordedTrack("09:30:00", "09:37:00")) // b-to-a recorded times
);
DayOfWeek requestedDayOfWeek = LocalDateTime.now().getDayOfWeek();
System.out.println(john.name + " " + requestedDayOfWeek.toString() +
" AtoB: " +
john.getDailyItinerary().AtoB.getDuration().getSeconds() + " (sec) " +
john.getDailyItinerary().AtoB.getDurationStr() + " (mm:ss)");
System.out.println(john.name + " " + requestedDayOfWeek.toString() +
" BtoA: " +
john.getDailyItinerary().BtoA.getDuration().getSeconds() + " (sec) " +
john.getDailyItinerary().BtoA.getDurationStr() + " (mm:ss)");
}
}
输出:
John Doe SUNDAY AtoB: 630 (sec) 10:30 (mm:ss)
John Doe SUNDAY BtoA: 420 (sec) 07:00 (mm:ss)