2015-03-10 5 views
0

Это, вероятно, будет слишком много информации, но только в том случае, я выложу все, что есть:HashMap перезаписываются при использовании ставить()

Tester

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. Обратите внимание: мне не нужны конфликтующие события, и я могу иметь несколько событий за каждую дату. Однако прямо сейчас, даже когда я пытаюсь добавить события к другой дате (клавише), она все еще перезаписывает предыдущую.

Прошу прощения за неприятный длинный пост, но я не уверен, как остановить его от перезаписи.

ответ

1

Ваш mCal определяется как локальная переменная внутри метода createEvent(), поэтому он воссоздается каждый раз. Если вы хотите, чтобы он работал через несколько вызовов, вам нужно создать его один раз и сохранить его в переменной вне метода, например, в поле класса или экземпляра на каком-либо другом объекте.

+0

Спасибо, ты потрясающий! Чтобы расширить это (в случае, если у кого-то есть аналогичная проблема), я также определяю mCal и myEvent локально в MenuHandler. Я переместил оба в класс, и все отлично работает. – aurora91

Смежные вопросы