这可能是太多的信息,但为了以防万一,我会发布我所拥有的一切:
测试
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;
enum MONTHS
{
January, February, March, April, May, June, July, August, September, October, November, December;
}
enum DAYS
{
Su, Mo, Tu, We, Th, Fr, Sa;
}
public class MyCalendarTester {
static MONTHS[] arrayOfMonths = MONTHS.values();
static DAYS[] arrayOfDays = DAYS.values();
public static void main(String[] args) {
// TODO Auto-generated method stub
GregorianCalendar cal = new GregorianCalendar(); // capture today
printCalendar(cal);
menuHandler();
System.out.println("\nI think we're done here!");
}
public static void printCalendar(Calendar cal){
GregorianCalendar dayCounter = new GregorianCalendar(); // capture today
dayCounter.set(Calendar.DAY_OF_MONTH, 1);
int formatCounter = 0;
System.out.println(" " + arrayOfMonths[cal.get(Calendar.MONTH) ] + " " + cal.get(Calendar.YEAR)); //prints the month and year
for(int i = 0; i < arrayOfDays.length; i++){
if(i == 0){
System.out.print(arrayOfDays[i]);
}
else{
System.out.print(" " + arrayOfDays[i]);
}
}//print days of week
System.out.println();
for(int i = 0; i < arrayOfDays.length; i++){
if(!arrayOfDays[i].equals(arrayOfDays[dayCounter.get(Calendar.DAY_OF_WEEK) - 1])){
System.out.print(" ");
formatCounter++;
}
else{
System.out.print(" " + cal.getActualMinimum(Calendar.DAY_OF_MONTH) + " ");
formatCounter++;
break;
}
}
for(int i = 1; i < cal.getMaximum(Calendar.DAY_OF_MONTH); i++){
if(formatCounter == 7){
System.out.println();
formatCounter = 0; //reset counter
}
dayCounter.roll(Calendar.DAY_OF_MONTH, true);
if(dayCounter.get(Calendar.DATE) == cal.get(Calendar.DATE)){
System.out.print("[" + dayCounter.get(Calendar.DATE) + "]");
formatCounter++;
}
else if(dayCounter.get(Calendar.DATE) <= 9){
System.out.print(" " + dayCounter.get(Calendar.DATE) + " ");
formatCounter++;
}
else{
System.out.print(dayCounter.get(Calendar.DATE) + " ");
formatCounter++;
}
}
}
public static void menuHandler(){
Scanner sc = new Scanner(System.in);
MyCalendar mCal = new MyCalendar();
Event myEvent = new Event();
System.out.println("\nSelect one of the following options:");
System.out.println("[L]oad [V]iew by [C]reate [G]o to [E]vent list [D]elete [Q]uit");
char userChoice = sc.next().charAt(0);
switch(Character.toUpperCase(userChoice)){
case 'L':
case 'V':
mCal.viewCalendar();
menuHandler();
case 'C':
myEvent.createEvent();
menuHandler();
case 'G':
case 'E':
case 'D':
case 'Q': return;
}
}
}
MyCalendar
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Scanner;
public class MyCalendar {
GregorianCalendar calendar;
private HashMap<GregorianCalendar, Event> myCalHash;
GregorianCalendar dayCounter = new GregorianCalendar(); // capture today
Scanner sc = new Scanner(System.in);
static MONTHS[] arrayOfMonths = MONTHS.values();
static DAYS[] arrayOfDays = DAYS.values();
MyCalendar(){
calendar = new GregorianCalendar();
myCalHash = new HashMap<GregorianCalendar, Event>();
}
public HashMap<GregorianCalendar, Event> getMyCalHash(){
return myCalHash;
}
public void setMyCalHash(HashMap<GregorianCalendar, Event> myCalHash) {
this.myCalHash = myCalHash;
}
public void viewCalendar() {
System.out.print("[D]ay view or [M]view? ");
char userChoice = sc.next().charAt(0);
if(Character.toUpperCase(userChoice) == 'D'){ dayView(); }
else if(Character.toUpperCase(userChoice) == 'M'){ monthView(); }
else{
System.out.println("Invalid choice.");
}
}
public void dayView(){
//print day calendar
//GregorianCalendar dayCounter = new GregorianCalendar(); // capture today
System.out.println(arrayOfDays[calendar.get(Calendar.DAY_OF_WEEK) - 1] + ", " + arrayOfMonths[calendar.get(Calendar.MONTH)] + " " + calendar.get(Calendar.DATE) + ", " + calendar.get(Calendar.YEAR));
System.out.print("[P]revious or [N]ext or [M]ain menu ? ");
char userChoice = sc.next().charAt(0);
if(Character.toUpperCase(userChoice) == 'P'){
calendar.add(Calendar.DAY_OF_MONTH, -1);
dayView();
}
else if(Character.toUpperCase(userChoice) == 'N'){
calendar.add(Calendar.DAY_OF_MONTH, 1);
dayView();
}
else if(Character.toUpperCase(userChoice) == 'M'){
return;
}
else{
System.out.println("Invalid choice.");
return;
}
}
public void monthView(){
//print month calendar
int formatCounter = 0;
dayCounter.set(Calendar.DAY_OF_MONTH, 1);
System.out.println(" " + arrayOfMonths[calendar.get(Calendar.MONTH) ] + " " + calendar.get(Calendar.YEAR)); //prints the month and year
for(int i = 0; i < arrayOfDays.length; i++){
if(i == 0){
System.out.print(arrayOfDays[i]);
}
else{
System.out.print(" " + arrayOfDays[i]);
}
}//print days of week
System.out.println();
for(int i = 0; i < arrayOfDays.length; i++){
if(!arrayOfDays[i].equals(arrayOfDays[dayCounter.get(Calendar.DAY_OF_WEEK) - 1])){
System.out.print(" ");
formatCounter++;
}
else{
System.out.print(" " + calendar.getActualMinimum(Calendar.DAY_OF_MONTH) + " ");
formatCounter++;
break;
}
}
for(int i = 1; i < dayCounter.getActualMaximum(Calendar.DAY_OF_MONTH); i++){
if(formatCounter == 7){
System.out.println();
formatCounter = 0; //reset counter
}
dayCounter.roll(Calendar.DAY_OF_MONTH, true);
if(dayCounter.get(Calendar.DATE) <= 9){
System.out.print(" " + dayCounter.get(Calendar.DATE) + " ");
formatCounter++;
}
else{
System.out.print(dayCounter.get(Calendar.DATE) + " ");
formatCounter++;
}
}
System.out.print("\n[P]revious or [N]ext or [M]ain menu ? ");
char userChoice = sc.next().charAt(0);
if(Character.toUpperCase(userChoice) == 'P'){
calendar.add(Calendar.MONTH, -1);
dayCounter.add(Calendar.MONTH, -1);
monthView();
}
else if(Character.toUpperCase(userChoice) == 'N'){
calendar.add(Calendar.MONTH, 1);
dayCounter.add(Calendar.MONTH, 1);
monthView();
}
else if(Character.toUpperCase(userChoice) == 'M'){
return;
}
else{
System.out.println("Invalid choice.");
return;
}
}
}
事件
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
public class Event {
String eventName;
GregorianCalendar startTime;
GregorianCalendar endTime;
Event(){}
Event(String eventName, GregorianCalendar startTime, GregorianCalendar endTime){
this.eventName = eventName;
this.startTime = startTime;
this.endTime = endTime;
} //end Event Constructor
public void createEvent(){
Scanner sc = new Scanner(System.in);
System.out.print("Enter the name of the event: ");
String name = sc.nextLine();
System.out.print("Date of event: ");
String dateAsString = sc.nextLine();
DateFormat sdf = new SimpleDateFormat("MM/DD/YYYY");
Date date = null;
String startTime = null;
String endTime = null;
MyCalendar mCal = new MyCalendar();
GregorianCalendar calDate = new GregorianCalendar();
String[] dateArr = dateAsString.split("/");
calDate.set(GregorianCalendar.YEAR, Integer.parseInt(dateArr[2]));
calDate.set(GregorianCalendar.MONTH, Integer.parseInt(dateArr[0]));
calDate.set(GregorianCalendar.DATE, Integer.parseInt(dateArr[1]));
DateFormat stf = new SimpleDateFormat("HH:MM");
System.out.print("Enter starting time and ending time(24 hour format, comma separated):");
String times = sc.nextLine();
// checks if user entered both start and end time
if(times.contains(",")){
String[] time = times.split(",");
startTime = time[0];
endTime = time[1];
GregorianCalendar calSTime = new GregorianCalendar();
String[] sTime = startTime.split(":");
calSTime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(sTime[0]));
calSTime.set(Calendar.MINUTE, Integer.parseInt(sTime[1]));
GregorianCalendar calETime = new GregorianCalendar();
String[] eTime = endTime.split(":");
calETime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(eTime[0]));
calETime.set(Calendar.MINUTE, Integer.parseInt(eTime[1]));
Event myEvent = new Event(name, calSTime, calETime);
mCal.getMyCalHash().put(calDate, myEvent); //adding date and event to HashMap
}else{ //if user did not specify an event end time
startTime = times;
endTime = null;
GregorianCalendar calSTime = new GregorianCalendar();
String[] sTime = startTime.split(":");
calSTime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(sTime[0]));
calSTime.set(Calendar.MINUTE, Integer.parseInt(sTime[1]));
Event myEvent = new Event(name, calSTime, null);
mCal.getMyCalHash().put(calDate, myEvent);//adding date and event to HashMap
}
System.out.println("Here is what is in the HashMap:");
System.out.println("HashMap size = " + mCal.getMyCalHash().size());
for (Entry<GregorianCalendar, Event> entry : mCal.getMyCalHash().entrySet()) {
Event value = entry.getValue();
System.out.println("key, " + entry.getKey().get(Calendar.MONTH) + "/" + entry.getKey().get(Calendar.DATE) + "/" + entry.getKey().get(Calendar.YEAR) +
" value: " + value.eventName + " " + value.startTime.get(Calendar.HOUR_OF_DAY) + ":" +
value.startTime.get(Calendar.MINUTE) + " " + value.endTime.get(Calendar.HOUR_OF_DAY) + ":" + value.endTime.get(Calendar.MINUTE));
}
}
}
每次调用createEvent()时,我都会覆盖我的日历HashMap。有谁知道发生了什么事?我希望能够添加到我现有的HashMap中。请注意,我不关心相互冲突的事件,每个日期我可以有多个事件。但是,现在,即使我尝试将事件添加到不同的日期(键),它仍会覆盖前一个。
我为这篇令人讨厌的长篇帖子道歉,但我不确定如何阻止它被覆盖。
答案 0 :(得分:1)
您的mCal
被定义为createEvent()
方法中的局部变量,因此每次都会重新创建它。如果您希望它通过多次调用,您需要创建一次并将其存储在方法外部的变量中,例如在某个其他对象的类或实例字段中。