我有一个名为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而不重复?
答案 0 :(得分:4)
您不需要HashMap
。
Set
应该做。
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
将项目存储在键值对中。它不记得实现事物的顺序(实际上List
和Map
在意识形态上是不同的。列表的概念是按顺序存储东西,并使用索引(位置)来识别它们并且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。