2

2 つの配列リストがあります。それぞれに従業員タイプのオブジェクトのリストがあります。

Employee クラスは以下のようになります

    public class Employee {

    private int id; // this is the primary key from employee table

    private String firstname;

    private String lastname;

    private String employeeId; // manually assigned unique id to each employee

    private float fte;

    Employee(String firstname, String lastname, String employeeId, float fte) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.employeeId = employeeId;
        this.fte = fte;
    }

    // getters and setters
}

従業員 ID は、各従業員に与えられる手動で生成された一意の ID です。

異なる従業員を持つ従業員 ID に基づいて、2 つのリスト間で共通の従業員を見つける必要があります。

    import java.util.ArrayList;
import java.util.List;

public class FindFTEDifferencesBetweenMatchingEmployeeIds {

    public static void main(String args[]) {
        List<Employee> list1 = new ArrayList<Employee>();
        List<Employee> list2 = new ArrayList<Employee>();

        list1.add(new Employee("F1", "L1", "EMP01", 1));
        list1.add(new Employee("F2", "L2", "EMP02", 1));
        list1.add(new Employee("F3", "L3", "EMP03", 1));
        list1.add(new Employee("F4", "L4", "EMP04", 1));
        list1.add(new Employee("F5", "L5", "EMP05", 1));
        list1.add(new Employee("F9", "L9", "EMP09", 0.7F));

        list2.add(new Employee("F1", "L1", "EMP01", 0.8F));
        list2.add(new Employee("F2", "L2", "EMP02", 1));
        list2.add(new Employee("F6", "L6", "EMP06", 1));
        list2.add(new Employee("F7", "L7", "EMP07", 1));
        list2.add(new Employee("F8", "L8", "EMP08", 1));
        list2.add(new Employee("F9", "L9", "EMP09", 1));

        List<FTEDifferences> commonInBothListWithDifferentFTE = new ArrayList<FTEDifferences>();
        // this should contain EMP01 and EMP09
        // since EMP02 has same FTE in both lists, it is ignored. 


    }
}

従業員 ID EMP01 と EMP09 を持つ従業員は、両方のリストで共通しており、リストごとに異なる勤務先も持っています。

したがって、この 2 人の従業員を含む別のリストが必要です。

    public class FTEDifferences {

    private Employee fromList1;

    private Employee fromList2;

    public Employee getFromList1() {
        return fromList1;
    }

    public void setFromList1(Employee fromList1) {
        this.fromList1 = fromList1;
    }

    public Employee getFromList2() {
        return fromList2;
    }

    public void setFromList2(Employee fromList2) {
        this.fromList2 = fromList2;
    }
}

助けてください。

PS。SQL でこれを行うのは簡単ですが、クエリを変更できないため、SQL クエリでは実行できません。指定された 2 つのリストを操作するだけで済みます。:(

4

4 に答える 4

1

equals()hashcode()およびcompareTo()メソッドをEmployeeクラスに追加します。次に、retainAll()または静的クラスremoveAll()からの操作などを試して設定することができます。Collections

いずれかの時点で何らかの方法で比較する場合は、これらのメソッドをクラスに追加することをお勧めします。

于 2012-07-19T06:54:50.593 に答える
0

equals 以下のようにメソッドをオーバーライドします。

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Employee other = (Employee) obj;
    if (employeeId == null) {
        if (other.employeeId != null)
            return false;
    } else if (!employeeId.equals(other.employeeId))
        return false;
    if (firstname == null) {
        if (other.firstname != null)
            return false;
    } else if (!firstname.equals(other.firstname))
        return false;
    if (Float.floatToIntBits(fte) == Float.floatToIntBits(other.fte))
        return false;
    if (lastname == null) {
        if (other.lastname != null)
            return false;
    } else if (!lastname.equals(other.lastname))
        return false;
    return true;
}

次に、finalListリストを作成して追加list1します。次に、リストでretainAllを呼び出します。これにより、に基づいて共通の情報が得られますfinalListlist2EmployeesemployeeId

   List<Employee> finalList=new ArrayList<Employee>();
    finalList.addAll(list1);
    finalList.retainAll(list2);
    List<Employee> commonInBothListWithDifferentFTE=finalList;
    System.out.println(commonInBothListWithDifferentFTE);

出力:

[Employee [firstname=F1, lastname=L1, employeeId=EMP01, fte=1.0], Employee [firstname=F9, lastname=L9, employeeId=EMP09, fte=0.7]]
于 2012-07-19T07:21:22.717 に答える
0

hashcode と equals() メソッドをオーバーライドする

于 2012-07-19T06:55:28.967 に答える
0

従業員の最大数が約 500 人または 1000 人の場合は、二重にネストされたループを使用してください。それは十分に速いはずです。このメソッドの時間計算量は O(mn) で、m と n は 2 つのリストのサイズです。

従業員の最大数が 3000 人以上になると予想される場合は、次の 2 つの方法を検討できます。

もう 1 つの方法は、従業員番号の辞書式順序に基づいて両方のリストをソートし ( a を実装Comparator)、単一のループを使用して両方のリストを同時にループすることです。複雑さは O(mlog m + nlog n) です。

より最適にしたい場合は、HashSet (equalsおよびオーバーライドhashCode) を使用して、1 つのリストのすべての要素を HashSet に入れることができます。もう一方のリストをループして、最初のリストから同じ従業員を選択し、比較を行うことができます。償却された複雑さは O(m + n) です。

于 2012-07-19T08:21:31.473 に答える