2017-02-24 1 views
0

데이터 숙제 & 알고리즘 클래스는 System Task Workorder Program을 작성하라고 알려줍니다. 새로운 SystemTask 객체를 배열에 추가하고, 작업을 삭제하고, 정렬 된 객체 배열을 나열/인쇄하는 것과 같은 다양한 작업을 수행 할 것을 요청합니다.JAVA : Object Array는 마지막 요소 만 인쇄합니다.

나는 대부분의 코딩 작업을 이미 끝냈지 만, 나는 내 객체 배열을 인쇄 할 수 밖에 없다. 객체 배열에 마지막으로 추가 한 데이터가 무엇이든 내 배열의 모든 요소에 대한 데이터가됩니다.

일부 지침 :

  • 내 WorkOrders는() 생성자는 배열의 4 기본 SystemTask 오브젝트를 배치해야합니다.
  • listSystemTask() 메서드는 번호가 앞에있는 배열의 모든 SystemTask 객체를 순서대로 나열합니다.

참고 : 목록 또는 사전 java 방법을 사용하지 말아주십시오. 숙제에는 한계가 있습니다.

SystemTask 클래스

public class SystemTask{ 

    private static String month, message; 
    private static int day, hour, minute; 

    //constructor methods 
    public SystemTask(){ 
    month = "Jan"; 
    day = 1; 
    hour = 00; 
    minute = 00; 
    message = "Task Here"; 
    } 

    public SystemTask(String mon, int d, int h, int mnt, String msg){ 
    month = mon; 
    day = d; 
    hour = h; 
    minute = mnt; 
    message = msg; 

    /*setMonth(mon); 
    setDay(d); 
    setHour(h); 
    setMinute(mnt); 
    setMessage(msg);*/ 
    } 

    //get and set methods 
    public static String getMonth(){ 
    return month; 
    } 
    public static int getDay(){ 
    return day; 
    } 
    public static int getHour(){ 
    return hour; 
    } 
    public static int getMinute(){ 
    return minute; 
    } 
    public static String getMessage(){ 
    return message; 
    } 
    public static void setMonth (String mon){ 
    if(mon.length()!= 3) 
     System.out.println("Invalid 3 Letter Code. Try Again."); 
    else 
     month = mon; 
    } 
    public static void setDay(int d){ 
    if(d<1 || d>31) 
     System.out.println("Invalid Day. Try Again."); 
    else 
     day = d; 
    } 
    public static void setHour(int h){ 
    if(h<0 || h>23) 
     System.out.println("Invalid Hour. Try Again."); 
    else 
     hour = h; 
    } 
    public static void setMinute(int mnt){ 
    if(mnt<0 || mnt>59) 
     System.out.println("Invalid Minute. Try Again."); 
    else 
     minute = mnt; 
    } 
    public static void setMessage(String msg){ 
    if(msg.length()<1 || msg.length()>40) 
     System.out.println("Invalid Message. Try Again."); 
    else 
     message = msg; 
    } 

    @Override 
    public String toString(){ 
    return getMonth()+" "+getDay()+", "+String.format("%02d",getHour()) 
      +":"+String.format("%02d",getMinute())+" "+getMessage(); 
    } 
} 

WorkOrder 클래스

public class WorkOrders { 

private final SystemTask[] ary = new SystemTask[20]; //declare private 20 objects array 
//public static int index, empty; 

public static void main(String args[]){ 
    WorkOrders object = new WorkOrders();  //create a WorkOrders object 
    object.run();        //call a run method 
} 

public WorkOrders(){ 
    // for(int i = 0;i<ary.length;i++){ 
    //  ary[i] = new SystemTask(); 
    // } 

    /*SystemTask t1 = new SystemTask("Mar", 4, 21, 30, "Backup Users"); 
    ary[0] = t1; 
    SystemTask t2 = new SystemTask("Apr", 1, 17, 0, "Upgrade Hard Drives"); 
    ary[1] = t2; 
    SystemTask t3 = new SystemTask("May", 6, 10, 45, "Virus Scan"); 
    ary[2] = t3; 
    SystemTask t4 = new SystemTask("Jun", 3, 9, 15, "Database Backup"); 
    ary[3] = t4;*/ 

    ary[0] = new SystemTask("Mar", 4, 21, 30, "Backup Users"); 
    ary[1] = new SystemTask("Apr", 1, 17, 0, "Upgrade Hard Drives"); 
    ary[2] = new SystemTask("May", 6, 10, 45, "Virus Scan"); 
    ary[3] = new SystemTask("Jun", 3, 9, 15, "Database Backup"); 
} 

public void run(){ 
    char choice; 
    do{ 
     System.out.println("SYSTEM WORKORDER PROGRAM:"); 
     System.out.println("A)dd SystemTask"); 
     System.out.println("D)elete SystemTask"); 
     System.out.println("L)ist SystemTask"); 
     System.out.println("E)xit"); 
     System.out.print("Select an option: "); 
     choice = UserInput.getChar(); 

     switch (choice) { 
      case 'a': 
      case 'A': 
       //addSystemTask(); 
       break; 
      case 'd': 
      case 'D': 
       //deleteSystemTask(); 
       break; 
      case 'l': 
      case 'L': 
       listSystemTask(); 
       break; 
      case 'e': 
      case 'E': 
       System.out.println("You quit the program."); 
       System.out.println("\nThanks for using System Workorder!"); 
       System.exit(0); 
       break; 
      default: 
       System.out.println("\'" + choice + "\' does not exist. Try    again."); 
       break; 
     } 
     System.out.println(); 
    }while(choice !='E'|| choice !='e'); 
} 

public void listSystemTask(){ 
    System.out.println("\nALL LISTED TASKS"); 
    for(int c=0;c<ary.length;c++){ 
     if(ary[c]!=null) 
      System.out.println(c+1 + ": " + ary[c].toString()); 
    } 
}  

내가 만든 또 다른 UserInput 사용자 클래스가있다. 키보드 입력 만하기 때문에 포함하지 않았습니다. 내 질문과 관련이없는 몇 가지 코드/메소드를 생략했다. 필자는 배열에있는 객체를 인쇄하는 것에 만 관심이 있습니다.

SYSTEM WORKORDER PROGRAM: 
A)dd SystemTask 
D)elete SystemTask 
L)ist SystemTask 
E)xit 
Select an option: L 

ALL LISTED TASKS 
1: Jun 3, 09:15 Database Backup 
2: Jun 3, 09:15 Database Backup 
3: Jun 3, 09:15 Database Backup 
4: Jun 3, 09:15 Database Backup 

문제가 어디에서 오는 모르겠어요 :

여기서 문제는 이것이 내가 목록을 인쇄 할 때 출력 무엇을 얻을입니다. 나는 그것을 생성자의 배열을 초기화하는 것으로 의심하고 있지만 그것을 고칠 수없는 것 같습니다. 아니면 다른 장소에 있을까요?

+0

의 사용 가능한 복제 [왜 ArrayList의 마지막 항목의 N 복사 목록에 추가 포함되어 있습니까?] (http://stackoverflow.com/questions/19843506/why-does-my-arraylist-contain- 마지막 항목에 마지막으로 추가 된 항목) –

+0

그런데 개체를 배열에 정확하게 "추가"할 수는 없습니다. 배열의 크기는 고정되어 있습니다. 그래서, 당신은 오히려 배열에 "설정" –

답변

3

문제는 당신이 static 모든 멤버 변수를 선언 한

public class SystemTask { 
    private static String month, message; 
    private static int day, hour, minute; 

SystemTask 클래스입니다. SystemTask의 인스턴스가 여러 개 있지만 모두 동일한 값인 static 필드에 값을 저장하고 있습니다. "마지막으로 SystemTask"을 인쇄하고 있기 때문에 마지막으로 작성된 값이므로 이전 값으로 설정된 값을 덮어 씁니다.

는 간단히 또한 static 모든 접근 방법을 정의

public class SystemTask { 
    private String month, message; 
    private int day, hour, minute; 

... static 선언을 제거합니다. 이들이 객체 범위 변수에 액세스 할 수있게하려면 static도 삭제하십시오.

public static String getMonth() { 
    return month; 
    } 

되세요 ...

public String getMonth() { 
    return month; 
    } 
+0

대단히 감사합니다. 이것은 효과가 있었다. 나는'static' 키워드를 언제 사용해야하는지 더 알아야 할 필요가 있다고 생각합니다. –

+0

@DavidDredddeJesus 정적 사용에 대한 일반적인 규칙은 VERY RAIRLY입니다. :) 그들은 anti-pattern으로 간주되는 "singletons"를 만듭니다. 싱글 톤이 필요하다고 생각된다면, 종종 싱글 톤을 피하거나 실제로 필요한 수를 줄이는 방법이 있습니다. 웹에는 싱글 톤에 대한 많은 토론과 장단점이 있습니다. – slipperyseal

관련 문제