0

Java のリンクエンド リストのコピー コンストラクターに問題があります。コピーしようとしているリストのサイズは 3 です。コピー コンストラクターを使用すると、リストは空になります。

clone メソッドでこれを試すと、すべてうまくいきます。私はこれをかなり長い間見てきましたが、それがとても明白だと感じています。私はそれを見ません、ここにコードがあります。

public class Employee {

    private String name;
    private double salary;

    public Employee(String name, double salary){

        this.name = name;
        this.salary = salary;
    }

    public void setname(String name){
        this.name = name;
    }

    public void setsalary(double salary){
        this.salary = salary;
    }

    public String getname(){
        return this.name;
    }

    public double getsalary(){
        return this.salary;
    }
}


    public class Main {

    public static void main(String[] args) {

        Employees employees = new Employees();
        employees.add(new Employee("Employee1", 2500.00));
        employees.add(new Employee("Employee2", 2400.00));
        employees.add(new Employee("Employee3", 2000.00));

        Employees employeesCopy2 = new Employees(employees);
        Employees employeesCopy = (Employees) employees.clone();

        System.out.println(employees.size());
        System.out.println(employeesCopy2.size());
        System.out.println(employeesCopy.size());
    }

}

    import java.util.LinkedList;

public class Employees extends LinkedList<Employee> {

    private static final long serialVersionUID = 1L;
    private LinkedList<Employee> employees;

    public Employees(){ 

        employees = new LinkedList<Employee>();
    }

    public Employees(Employees w){

        employees = new LinkedList<Employee>(w);
    }

    public void addWerknemer(Employee w){
        employees.add(w);
    }
}

編集

これは宿題なのですが、タグを付けようとしたらタグが使われなくなったと表示されました。

4

3 に答える 3

4

私はこう思います:

public class Employees extends LinkedList<Employee> {

    private LinkedList<Employee> employees;

混乱の世界を作ります。両方ともリストを拡張しており、そのクラス内で別のリストを維持しています。呼び出すaddWerknemer()と、内部リストに追加されます。を呼び出すとどうなりますget()か? これをオーバーライドしていないためget()、基本クラスを呼び出しており、それはのリストです!

コードの残りの部分を検査しなければ、これが問題の根本的な原因であると思われます。

次の 2 つの選択肢があります。

  1. Employees伸びるList
  2. Employeesを含むList

私は2番目の方が好きです。基礎となるコレクション (たとえば、検索パフォーマンスを向上さSetせるための ) を変更できますが、公開されたインターフェイスは変更できません。Map

于 2012-11-30T10:35:16.133 に答える
1

あなたは拡張していますが、その拡張の内部にLinkedListもあります。LinkedList最初はaddメソッドを使用してEmployeeインスタンスを追加するため、インスタンスはEmployeesリスト自体に追加されますが、コピーコンストラクターを使用する場合は、それらの従業員をクラスemployees内のフィールドにコピーします。Employees

メソッドを呼び出すと、オブジェクト自体のsize()を使用するため、最初のリストでは3ですが、2番目のリストでは0です。これは、従業員がオブジェクト自体ではなく、含まれているリストに含まれているためです。LinkedListEmployees

この場合、おそらく拡張しないLinkedListでください。employeesまたは、そうする場合は、LinkedListも含まれるような別のフィールドを使用しないでください。

于 2012-11-30T10:36:31.230 に答える
0

あなたの混乱は、Employees両方リストであり、リストを含むという事実から来ています。使用するとき

employees.add(new Employee("Employee1", 2500.00));

従業員を外部リストに追加します。使用するとき

employees.addWerknemer(new Employee("Employee1", 2500.00));

従業員を内部リストに追加します。constructor を上書きしたためEmployees(Employees es)、これ外側のリストを複製せず、内側のみを複製します。を上書きclone()していないため、外側のリスト複製されますが、内側のリストは複製されません。これはかなり厄介で、おそらくあなたが意図したものではありません。したがって、次のいずれかの変更を提案します。

1. [推奨] 従業員にはリストのみが含まれ、リストは拡張されません
。 スキップextends LinkedList<Employee>して内部リストのみを操作します。メソッドを使用addWerknemer(Employee emp)してリストに追加する (または名前を に変更するadd) 必要があります。size使用したい他のメソッドとclone同様に実装する必要があります。これについて本当にきれいにしたい場合は、クラスを作成することもできimplement Listますimplement Collection。このようにして、クラスをjava.util.Collection. ただし、これはあなたの場合には必要ないと思います。また、すべてのインターフェイス メソッドを実装する必要があります (多数あります)。実装例は次のようになります。sizeなどを実装する必要があります。

public class Employees /*implements List<Employees>*/ {
    private static final long serialVersionUID = 1L;
    private LinkedList<Employee> employees;

    public Employees(){ 
        employees = new LinkedList<Employee>();
    }

    public Employees(Employees w){
        employees = new LinkedList<Employee>(w);
    }

    public void add(Employee w){
        employees.add(w);
    }

    public Employees clone() {
        return employees.clone();
    }

    // add more methods as you need them (like remove, get, size, etc)
}

2. Employees は拡張のみでLinkedList、1 つも含まれていません
。メソッドaddWerknemer(Employee emp)とコピー コンストラクターEmployees(Employees)、および内部リストを破棄します。この方法では、 の既存の実装を上書きしませんLinkedListLinkedList基本的に名前を変更してEmployees何も追加/変更しないため、このアプローチは多かれ少なかれ役に立ちません。したがって、このアプローチはお勧めしません。

于 2012-11-30T11:05:57.780 に答える