0

私はそれを実装する2つのクラス(たとえばアシスタントとマネージャー)を持つインターフェイス(たとえば従業員)を持っています。また、最初のインターフェイスタイプのリストを返すメソッドを持つインターフェイスもあります(たとえば、Listを返すEmployeeLogicインターフェイス。このインターフェイスを実装する2つのクラス(たとえば、AssistantLogicとManagerLogic)があります。これら2つのクラスでは、Listにはアシスタントのみが含まれます。 (AssitantLogic内)およびManagerのみ(ManagerLogic内)。

問題は、サブクラスにのみ存在するメソッドに基づいて、これら2つのリストを並べ替えたいということです。このようなコンパレータを作成するにはどうすればよいですか?

おそらく、コードはより理解しやすいでしょう:

public interface Employee {
    public int employeeMethod();
}

public class Manager implements Employee {
    public int employeeMehod(){//[...]}
    public int managerMethod(){//[...]}
}

public class Assistant implements Employee {
    public int employeeMehod(){//[...]}
    public String assistantMehod(){//[...]}
}

public interface EmployeeLogic() {
    public List<Employee> getEmployees();
}

public class ManagerLogic implements EmployeeLogic {
    public List<Employee> getEmployees() {

        List<Employee> employees = [...] //or List<? extends Employee> ?
        [...]
        Collections.sort(employees, new Comparator<Manager>() {
            @Override
            public int compare(Manager o1, Manager o2) {
                return o1.managerMethod().compareTo(o2.managerMethod());
            }
        });
        return employees;
    }

}

public class AssistantLogic implements EmployeeLogic {
    public List<Employee> getEmployees() {

        List<Employee> employees = [...] //or List<? extends Employee> ?
        [...]
        Collections.sort(employees, new Comparator<Assistant>() {
            @Override
            public int compare(Assistant o1, Assistant o2) {
                return o1.assistantMehod().compareTo(o2.assistantMehod());
            }
        });
    return employees;
    }
}

そのようなコンパレータを書く方法はありますか?

私は回避策を知っていますが(以下を参照)、上記のことは1つのリストだけで可能ですか?

public class ManagerLogic implements EmployeeLogic {
        public List<Employee> getEmployees() {

            List<Manager> managers = new ArrayList<Manager>()
            [...]
            Collections.sort(managers, new Comparator<Manager>() {
                @Override
                public int compare(Manager o1, Manager o2) {
                    return o1.managerMethod().compareTo(o2.managerMethod());
                }
            });
            List<Employee> employees = new ArrayList<Employee>();
            employees.addAll(managers);
            return employees;
        }

    }
4

1 に答える 1

1

Assistant私があなたを正しく理解しているなら、あなたの問題はsとsの組み合わせをソートしようとすることではなく、sのリストまたはsのManagerリストのいずれかしかソートできないという事実についてですが、s。AssistantManagerEmployee

その場合、あなたができることの1つは、をgetEmployees()返すことList<? extends Employee>です。それがオプションではなく、返されたリストを変更する予定がない場合は、を行うことができますreturn Collections.unmodifiableList(managers)。返されたリストを変更可能にする場合は、ソリューションが最もクリーンな方法です。

于 2012-05-10T07:17:13.387 に答える