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);

使用第一类的方法

所以我的问题是如何使用 hashmap 从 listPers 中获取人员而不在“Nom”中重复?

4

3 回答 3

4

你不需要一个HashMap。ASet应该做的。

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

或更简单地说:

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

equals and hashCode在 Personne 类中也实现了make 。(另请参阅此问题的答案)

在您发表评论并知道这是家庭作业后更新:

ArrayList(或者,一般来说,List)是一种存储项目列表并记住项目添加到列表中的顺序的数据结构。正如您已经发现的那样,它不能保证项目的唯一性。

AHashMap将项目存储在键值对中。它不记得实现事物的顺序(实际上ListMap意识形态不同的事物。列表的概念是按顺序存储东西,并使用索引(位置)来标识它们,而映射是通过键标识值

AMap保证每个键只有一个值。当您添加另一个值时,前一个值将被覆盖。

因此,您需要一个带有唯一标识您的对象的键的地图。这nomPersonne.

HashMap使用键作为String(对于nom)和值创建 -Personne本身:

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

遍历List,获取一个Personne对象并将该对象添加到Map. 就像是:

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

personne您列表中的对象在哪里

现在Map将只有Personne具有唯一名称的 s。

注意:如果有两个Personne同名的s,列表中后面的一个将覆盖地图中前面的一个。如果您想避免这种情况,您可以使用该containsKey方法查看 Map 是否已经有 key,如果没有,则添加到 map 中。

于 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);
    }
}

请注意,这种方法完全忽略了 prenom,因为您希望人们只在 nom 中没有重复。这会保留给定名称的第一个人。您也可以使用哈希映射来做到这一点:

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);
    }
}

否则,只需添加没有包含检查的人员。这样,您将只保存列表中具有注册名称的最后一个 Personne。

请注意,我使用 Map 接口来表示地图,但您可以直接创建一个 HashMap。

于 2012-05-25T18:18:21.297 回答