2013-08-22 116 views
1

我正在嘗試編寫以下問題的代碼: 用於獲取empno,DOB和少數員工工資的WAP。 編寫兩個匿名內部類,一個實現按照其DOB排序員工的接口,另一個匿名內部類擴展一個類,按員工薪水對員工進行排序。 我的代碼是:在java中調用匿名類方法

//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,Employee類型的,由返回的值方法SalarySort(),它返回void。

你只是想

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

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

BTW,讀取編譯器錯誤消息可能會有助於發現問題。

另一個問題是,上面的代碼應該在主方法中,其中list被定義,而不是在它之外。另外,請尊重Java命名約定,併爲您的類,方法和變量選擇合適的名稱。不要將員工的名字命名爲非員工。不要將XxxInnerClass命名爲不是內部類的東西。

+0

非常感謝!是的,將尊重Java命名約定。 –

1

這個怎麼樣?它使用匿名內部類實現一個接口,並且還擴展了一個類。

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; 
    } 

} 
}