0

Personneという名前のクラスがあります

public class Personne implements java.lang.Comparable<Personne> {

protected String nom;
protected String prenom;

public Personne(String nom,String prenom){
    this.nom=nom;
    this.prenom=prenom;
}

public String toString(){
    return nom+", "+prenom;
}

@Override
public int compareTo(Personne pers) {
    // TODO Auto-generated method stub
     if(!(pers instanceof Personne))
          throw new ClassCastException();
     Personne p = pers;
     int comparaison;
        if((comparaison = nom.compareTo(p.getNom())) != 0)
                return  comparaison;
        else if((comparaison = prenom.compareTo(p.getPrenom())) != 0)
                return comparaison;

     return comparaison;

}


public String getNom() {
    return nom;
}

public void setNom(String nom) {
    this.nom = nom;
}

public String getPrenom() {
    return prenom;
}

public void setPrenom(String prenom) {
    this.prenom = prenom;
}

  }

と私は人の外のクラスのリストを持っています

    public class ListePersonne {

protected static ArrayList <Personne> listPers = new ArrayList <Personne>();

public static void main(String[] ards){

    Personne p1 = new Personne("Bachene","Adel");
    listPers.add(p1);

    Personne p2 = new Personne("Bourada","Amine");
    listPers.add(p2);

    Personne p3 = new Personne("Bachene","Amine");
    listPers.add(p3);

    Personne p4 = new Personne("Benouda-zouaui","Khalil");
    listPers.add(p4);

    Personne p5 = new Personne("Bachene","Hakim");
    listPers.add(p5);

    Personne p6 = new Personne("Mazachi","Oussama");
    listPers.add(p6);

    Personne p7 = new Personne("Bachene","Issam");
    listPers.add(p7);

    Personne p8 = new Personne("Allel","Mohamed");
    listPers.add(p8);

    Personne p9 = new Personne("Bachene","Mohamed");
    listPers.add(p9);

    Personne p10 = new Personne("Yank","Maher");
    listPers.add(p10);

ファーストクラスのメソッドを使用して

だから私の質問は、ハッシュマップを使用して「Nom」で繰り返しなしでlistPersからpersonnesを取得する方法ですか?

4

3 に答える 3

4

そのためのは必要ありませんHashMap。するSet必要があります。

Set uniquePers = new HashSet(listPers);
List listUniquePers = new ArrayListSet(uniquePers);

またはもっと簡単に:

List listUniquePers = new ArrayListSet(new HashSet(listPers));

また、makeequals and hashCodeはPersonneクラスに実装されています。(この質問への回答も参照してください)

コメントの後、これが宿題であることを知った後、更新してください。

ArrayList(または、一般的にList)は、アイテムのリストを格納し、アイテムがリストに追加された順序を記憶するデータ構造です。すでにご存知のように、アイテムの一意性を保証するものではありません。

AHashMapは、アイテムをキーと値のペアで格納します。実装された順序は覚えていません(実際ListMapは、イデオロギー的に異なるものです。リストの概念は、ものを順番に格納し、インデックス(位置)を使用してそれらを識別し、マップはキーを介して値を識別することです) 。

キーごとに1つの値のみが存在するMapことを保証します。別の値を追加すると、前の値が上書きされます。

したがって、オブジェクトを一意に識別するキーを持つマップが必要です。これがのnomですPersonne

HashMapキーをString(のnom)および値として作成 します-Personneそれ自体:

HashMap<String, Personne> uniquePersonne = new HashMap<String, Personne>();

をループし、オブジェクトをList取得して、Personneオブジェクトをに追加しますMap。何かのようなもの:

uniquePersonne.put(personne.getNom(), personne)

personneリストのオブジェクトはどこにありますか

これで、一意の名前を持つsMapのみが含まれるようになります。Personne

注:Personne同じ名前のが2つある場合、リストの後半にあるものが、マップ内の前の1つを上書きします。それを避けたい場合は、このcontainsKeyメソッドを使用して、マップにすでにキーがあるかどうかを確認し、ない場合にのみマップに追加できます。

于 2012-05-25T18:07:41.943 に答える
3

seen表示した名前のハッシュセットを作成し、リストを確認しながら名前を追加し、ハッシュセットにエントリがないアイテムのみを保持します。

Set<String> seen = new HashSet<String>();
List<Personne> unique = new ArrayList<Personne>();
for (Personne p : listPers) {
    if (seen.add(p.nom)) {
        unique.add(p);
    }
}

nomのみで繰り返しのない人が必要なため、このアプローチではprenomを完全に無視することに注意してください。これにより、指定された名前の最初の人が保持されます。ハッシュマップを使用してそれを行うこともできます。

Map<String,Personne> byName = new HashMap<String,Personne>();
for (Personne p : listPers) {
    byName.put(p.nom, p);
}
List<Personne> unique = new ArrayList<Personne>(byName.values());
于 2012-05-25T18:07:32.940 に答える
1

それらを挿入して名前で並べ替えることを考えると、どれを保持するかを定義する必要があります。Personneの最初の外観を維持したい場合、コードは次のとおりです。

Map<String, Personne> personneMap = new HashMap<String, Personne>();
for(Personne p : listPers) {
    if(!personneMap.contains(p.getNom())) {
        personneMap.put(p.getNom(), p);
    }
}

それ以外の場合は、containsチェックなしでPersonnesを追加します。そうすれば、リストに登録されている名前の最後の人物のみを保存できます。

マップを表すためにMapインターフェースを使用していますが、HashMapを直接作成できることに注意してください。

于 2012-05-25T18:18:21.297 に答える