0

私はJavaクラスを持っています

class Students{
    private String fName;   
    private String lName;
    private String uName;


    public Students(String fName, String lName, String uName) {
            this.fName = fName;
            this.lName = lName;
            this.uName = uName;
     }      

    public String getuName() {
        return uName;
    }
    public void setuName(String uName) {
        this.uName = uName;
    }
    public String getfName() {
        return fName;
    }
    public void setfName(String fName) {
        this.fName = fName;
    }
    public String getlName() {
        return lName;
    }
    public void setlName(String lName) {
        this.lName = lName;
    }

}

また、私はこれを使用して呼び出します

public class TestClass {
public static void main(String[] args) {

    Students students1 = new Students("xyz","abc","xyzAbc");
    Students students2 = new Students("poi","son","poison");
    Students students3 = new Students("yog","jos","yogjos");

    Students students4 = new Students("xyz","abc","xyzAbc");
    Students students5 = new Students("pon","son","xyzAbc");
    Students students6 = new Students("yog","jos","someotherUName");
    Students students7 = new Students("yog","jos","someotherUName2");

    List studentList1 = new ArrayList();
    List studentList2 = new ArrayList();

    studentList1.add(students1);
    studentList1.add(students2);
    studentList1.add(students3);

    studentList2.add(students4);
    studentList2.add(students5);
    studentList2.add(students6);
}
}

ここで、一意の「uName」値のみを含むフィルタリングされたリストが必要です。したがって、各リストの「uName」フィールドを比較して、共通のものを削除します。

最後に、studentList1 と studentList2 の 2 つのファイル化されたリストが必要です。

removeAll メソッドについて読みましたが、(私の場合のように) オブジェクトのリストではなく、整数/文字列データのリストで機能するようです。

提案してください。

4

7 に答える 7

3

リストを設定してから、(必要に応じて) 元に戻すことができます。

new ArrayList(new HashSet<String>(list))ソース リストから一意の要素のみを含むリストを作成します。

于 2012-07-25T09:43:51.997 に答える
3

1.各リストに一意の uName値を持たせたい場合は、 fromをInterfaceTreeSet fromjava.util.Collectionと一緒に使用できます。 Comparatorjava.util.Comparator

2.両方のリストをマージして一意の uName を持ちたい場合は、両方のリストを結合してから と を使用TreeSetComparatorます。

3. 複数の方法で比較できる柔軟性をComparator提供する...

于 2012-07-25T09:44:47.937 に答える
2

実装removeAll内のオブジェクトが適切に機能する場合は、引き続き使用できます。Listequals()

AbstractCollection、は、の実装で使用されるほとんどの種類のList実装(を含むArrayList)のベースです。の実装は、最後にを使用するに依存しています。contains()removeAllArrayListcontainsindexOf()equals()

クラスに実装equals()して、フィールドのみが等しい場合に、anが別のanと等しいことを指定できます。StudentStudentuName

equalsにはセマンティクスが関連付けられていることに注意してください( javadocを参照)。実装方法を選択するときは注意が必要です。uNameが等しいときに、2つの学生インスタンスが実際に同じ学生を表すかどうかを検討してください。私の意見では、これはこれらのものをどのように分類するかという非常に具体的な要件のように聞こえ、クラスのセマンティクスに影響を与えるべきではありません。

@AlexRまたは@KumarVivekMitraのアプローチを使用すると、はるかにうまくいくでしょう。

于 2012-07-25T09:42:13.480 に答える
2

まず、リストを入力する必要があります。

List<Students> studentList1 = new ArrayList<Students>();

次に、と の両方にデリゲートするクラスにhashCode()とを実装equals()します。StudentsuName

public boolean equals(Object o) {
    return o instanceof Students && ((Students)o).uName.equals(uName);
}

public int hashCode() {
    return uName.hashCode();
}

これで問題なく動作しますremoveAll()


別のオプションは、メソッドSetによって決定される一意の値のみを許可するを使用することです。equals()上記のメソッドをクラスに追加すると、次のようになります。

Set<Students> students = new HashSet<Students>();

好きなものを追加すると、ユニークなuName学生だけがそこにいます。


ところで、単数形でクラスに名前を付ける必要があります-つまりStudent、 not Students.

于 2012-07-25T09:46:27.110 に答える
0

完全に機能するソリューションは次のようになります。

Class Student{


.....
......
.....

   public boolean equals(Object o) {
       return o instanceof Students && ((Students)o).uName.equals(uName);
   }

   public int hashCode() {
       return uName.hashCode();
   }




}


Set studentList1 = new hashSet();
Set studentList2 = new hashSet();

これらのセットに要素を入れます。

また、両方のセットで一意の一致しない要素が必要な場合。次に、次のように記述します。

studentList1.removeAll(studentList2 );
于 2012-07-25T09:51:06.500 に答える
0

クラス Student はメソッドhashcodeおよびをオーバーライドする必要がequalsあるため、オブジェクトは名前で一意にすることができます。ここで、その方法を読むことができます。

また、一部のコレクションで維持されるすべてのオブジェクトは、それらのメソッドをオーバーライドする必要があることに注意してください。これにより、それらがどのように比較されるかを常に知ることができます。

次のステップではremoveAll、 Set でメソッドまたはソリューションを使用できます。それはあなた次第です:-)

設定例

List<String> list = new ArrayList(new HashSet<String>(studentList));// ここにあなたのユニークなリストがあります

または、ハッシュコードと equals をオーバーライドする代わりにカスタム Comparator を使用することもできますが、学生を常に一意にしたい場合は、それらをオーバーライドする必要があります

于 2012-07-25T09:50:10.963 に答える
0

apache commons を使用することもできますCollectionUtils.disjunction。(リンク: http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html#disjunction(java.util.Collection , java.util.Collection))

于 2012-07-25T09:47:55.783 に答える