2013-08-22 4 views
1

다음 질문에 대한 코드를 작성하려고합니다 : 몇 명의 직원의 empno, DOB 및 월급을 얻기위한 WAP. 두 개의 익명 내부 클래스를 작성하십시오. 하나는 DOB별로 직원을 분류하는 인터페이스를 구현하는 클래스이고 다른 하나는 익명 내부 클래스로 클래스를 확장하여 임금 당 직원을 분류합니다. 내 코드는 다음과 같습니다자바의 익명 클래스 메소드를 호출하십시오

//required import statements 

public class OuterClass { 
    private int empno; 
    private String DOB; 
    private int salary; 

    public OuterClass() { 
     // TODO Auto-generated constructor stub 
    } 

    public OuterClass(int empn, String dob, int sal) { 
     //code for paramaterized constructor 
    } 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     List<OuterClass> list = new ArrayList<OuterClass>(); 
     while (true) { 
      //code for input from user and adding it in list 
     } 
    } 

    Employee abc = new Employee() { 
     @Override 
     void SalarySort(List<OuterClass> l) { 
      Collections.sort(l, new Comparator<OuterClass>() { 
       public int compare(OuterClass e1, OuterClass e2) { 
        return e1.salary - e2.salary; 
       } 
      }); 
      Iterator<OuterClass> itr = l.iterator(); 
      while (itr.hasNext()) { 
       OuterClass employee = (OuterClass) itr.next(); 
       System.out.println("Emp no : " + employee.empno + " Emp dob : " 
         + employee.DOB + " Emp Salary : " + employee.salary); 
      } 
     } 

    }.SalarySort(list);// compile error : create local field list 

} 

class Employee { 
    void SalarySort(List<OuterClass> l) { 

    } 
} 

내 질문에, 나는 익명 클래스 직원의 방법 SalarySort 호출하지 못할 것입니다, 어떻게 문제를 해결하기 위해? 당신이 아닌 컴파일 부분의 코드를 자르면

+1

1. 코드의 (들쭉날쭉 한) 들여 쓰기는 따르기가 매우 어렵습니다. 2. 질문이 익명 클래스에 관한 것이면 다른 관련없는 파트를 모두 제거하는 방법은 무엇입니까? –

+1

3. 오류 메시지가 무엇입니까? – Joni

+3

4. 왜 신이? – christopher

답변

3

, 그것은 그래서

Employee abc = new Employee() { ... }.SalarySort(list); 

아래로 비등, 당신은에 의해 반환 된 값으로 입력 직원의 변수 abc를 초기화하려는 메서드 SalarySort(), void를 반환합니다.

당신은 단순히 아마 문제를 찾는 데 도움이 것이 컴파일러 오류 메시지를 읽고, BTW

new Employee() { ... }.SalarySort(list); 

Employee abc = new Employee() { ... }; 
abc.SalarySort(list); 

또는

를 원한다.

또 다른 문제는 위 코드가 list이 정의 된 main 메서드 내부에 있어야하며 외부 코드가 아니어야한다는 것입니다.

또한 Java 명명 규칙을 존중하고 클래스, 메소드 및 변수에 적합한 이름을 선택하십시오. 종업원이 아닌 무언가를 종업원으로 지칭하지 마십시오. XxxInnerClass에 내부 클래스가 아닌 것을 지정하지 마십시오.

+0

많이 감사합니다! 네, 자바 명명 규칙을 존중할 것입니다. –

1

어때? 인터페이스를 구현하고 클래스를 확장하는 Anonymous 내부 클래스를 사용합니다.

import java.util.Arrays; 
import java.util.Comparator; 

public class AnonymousInner 
{ 
int empNo; 
double salary; 
MyDate dateOfBirth; 
public AnonymousInner(int empNo, double salary, MyDate dateOfBirth) 
{ 
    this.empNo = empNo; 
    this.salary = salary; 
    this.dateOfBirth = dateOfBirth; 
} 

@Override 
public String toString() 
{ 
    return "\nEmployee = " + empNo + " Salary= " + salary + " DOB= " + dateOfBirth; 
} 
public static void main(String[] args) 
{ 
    AnonymousInner[] a = 
    {new AnonymousInner(1, 5000, new MyDate(15, 0, 1994)), new AnonymousInner(2, 4000, 
      new MyDate(15, 1, 1993)), new AnonymousInner(3, 5000, new MyDate(15, 0, 1995)), 
      new AnonymousInner(4, 6000, new MyDate(16, 0, 1994)), new AnonymousInner(5, 9000, 
        new MyDate(15, 1, 1994))}; 

    Arrays.sort(a, new Comparator<AnonymousInner>() //This creates anonymous class that implements an interface 
    { 

     @Override 
     public int compare(AnonymousInner o1, AnonymousInner o2) 
     { 

      return ((Double) o1.salary).compareTo(o2.salary); 
     } 
    }); 
    System.out.println("Sorting on Salary"); 
    for (AnonymousInner s : a) 
    { 
     System.out.println(s); 
    } 

    a = new sortDOB() 
    { 
    }.sort(a); //this creates Anonymous class that extends a class 

    System.out.println("\nSorting on DOB\n"); 
    for (AnonymousInner s : a) 
    { 
     System.out.println(s); 
    } 

} 

} 

class sortDOB 
{ 

public AnonymousInner[] sort(AnonymousInner[] x) 
{ 
    int size = x.length; 
    for (int i = 0; i < size; i++) 
    { 
     for (int j = 0; j < size - 1; j++) 
     { 
      int k = j + 1; 
      int compare = (x[j].dateOfBirth).compareTo(x[k].dateOfBirth); 
      if (compare == 1) 
      { 
       AnonymousInner temp = x[j]; 
       x[j] = x[k]; 
       x[k] = temp; 

      } 
     } 
    } 
    return x; 
} 
} 

class MyDate implements Comparable<MyDate> 
{ 
int year, month, day; 
public MyDate(int day, int month, int year) 
{ 
    this.year = year; 
    this.month = month; 
    this.day = day; 
} 

public MyDate() 
{ 
} 

@Override 
public String toString() 
{ 
    return day + "/" + month + "/" + year; 
} 

@Override 
public int compareTo(MyDate o2) 
{ 
    if (year == o2.year) 
    { 
     if (month == o2.month) 
     { 
      if (day == o2.day) 
      { 
       return 0; 
      } 
      else if (day < o2.day) 
      { 
       return -1; 
      } 
      else 
      { 
       return 1; 
      } 

     } 
     else if (month < o2.month) 
     { 
      return -1; 
     } 
     else 
     { 
      return 1; 
     } 
    } 
    else if (year < o2.year) 
    { 
     return 1; 
    } 
    else 
    { 
     return -1; 
    } 

} 
}