如何使用HashMap获取列表的字符串而不重复

时间:2012-05-25 18:00:15

标签: java arraylist hashmap

我有一个名为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在'Nom'中从listPers获取personnes而不重复?

3 个答案:

答案 0 :(得分:4)

您不需要HashMapSet应该做。

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

或更简单:

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

同样在Personne类中实现equals and hashCode。 (另见this question的答案)

在您的评论之后

更新并且知道这是作业后:

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

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

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

因此,您需要一张带有唯一标识对象的键的地图。这是nom的{​​{1}}。

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

Personne

循环遍历HashMap<String, Personne> uniquePersonne = new HashMap<String, Personne>(); ,获取List对象并将对象添加到Personne。类似的东西:

Map

其中uniquePersonne.put(personne.getNom(), personne) 是列表中的对象

personne现在只有Map个唯一名称。

注意:如果有两个Personne具有相同的名称,则列表中稍后出现的那个将覆盖地图中较早的一个Personne。如果你想避免这种情况,你可以使用containsKey方法查看Map是否已经拥有密钥,只有在没有密钥时才添加到地图中。

答案 1 :(得分: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());

答案 2 :(得分:1)

考虑插入它们并按名称排序,你必须定义你想要保留哪些。如果要保留Personne的第一次出现,代码如下:

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

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

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