我正在与来自不同城镇的候选人一起编写关于试镜的代码。为此,我使用HashMap和TreeSet。现在,TreeSet不能包含重复的obj,因为Participant类中的ive重载equals方法。 但是无论如何,套装都会添加它们。 有什么办法可以解决这个问题?
我尝试了所有我能想到的事情,但找不到与我的问题相关的帖子。
代码:
package audition;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
class Audition {
Map<String,TreeSet<Participant>>participants;
public Audition() {
participants=new HashMap<String,TreeSet<Participant>>();
}
void addParticpant(String city, String code, String name, int age) {
Participant p=new Participant(code,name,age);
if(participants.get(city)==null) {
participants.put(city, new TreeSet<Participant>() {
private static final long serialVersionUID = 1L;
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
int br=0;
for(Participant p:this) {
if(br==this.size()-1)break;
br++;
sb.append(p).append('\n');
}
sb.append(this.last());
return sb.toString();
}
});
participants.get(city).add(p);
}
else {
participants.get(city).add(p);
}
}
void listByCity(String city) {
System.out.println(participants.get(city));
}
}
class Participant implements Comparable<Participant>{
String code;
String name;
int age;
public Participant(String code, String name, int age) {
this.code = code;
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
Participant p=(Participant)o;
return this.code.equals(p.code);
}
@Override
public int compareTo(Participant o) {
// TODO Auto-generated method stub
if(this.name.compareTo(o.name)==0) {
return Integer.compare(this.age, o.age);
}
return this.name.compareTo(o.name);
}
@Override
public String toString() {
return code+" "+name+" "+String.valueOf(age);
}
}
public class AuditionTest {
public static void main(String[] args) {
Audition audition = new Audition();
List<String> cities = new ArrayList<String>();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] parts = line.split(";");
if (parts.length > 1) {
audition.addParticpant(parts[0], parts[1], parts[2],
Integer.parseInt(parts[3]));
} else {
cities.add(line);
}
}
for (String city : cities) {
System.out.printf("+++++ %s +++++\n", city);
audition.listByCity(city);
}
scanner.close();
}
}
> Input:
> Скопје;001;Ана;17
> Скопје;002;Борис;19
> Скопје;002;Иван;15
> Скопје;003;Јована;23
> Скопје;004;Михаела;18
> Битола;002;Николина;17
> Битола;001;Стефанија;16
> Битола;001;Елена;19
> Битола;005;Анастасија;21
> Битола;004;Игор;20
> Гевгелија;003;Аце;17
> Гевгелија;001;Иван;25
> Гевгелија;002;Мартина;15
> Гевгелија;005;Наташа;19
> Гевгелија
> Битола
> Скопје
> my Output:
> +++++ Гевгелија +++++
> 003 Аце 17
> 001 Иван 25
> 002 Мартина 15
> 005 Наташа 19
> +++++ Битола +++++
> 005 Анастасија 21
> 001 Елена 19
> 004 Игор 20
> 002 Николина 17
> 001 Стефанија 16
> +++++ Скопје +++++
> 003 Јована 23
> 001 Ана 17
> 002 Борис 19
> 002 Иван 15
> 004 Михаела 18
> expected Output:
> +++++ Гевгелија +++++
> 003 Аце 17
> 001 Иван 25
> 002 Мартина 15
> 005 Наташа 19
> +++++ Битола +++++
> 005 Анастасија 21
> 004 Игор 20
> 002 Николина 17
> 001 Стефанија 16
> +++++ Скопје +++++
> 003 Јована 23
> 001 Ана 17
> 002 Борис 19
> 004 Михаела 18
代码用西里尔字母编写(不重要)
答案 0 :(得分:1)
TreeSet
并不使用equals
来确定两个对象是否相等。相反,它使用compareTo
,如果等于零,则认为两个对象相等。
因此,您需要确保在equals
中进行比较的内容和在compareTo
中进行比较的内容。
答案 1 :(得分:1)
根据您的预期,您的compareTo()
方法不正确。
您希望按预期使用不同的Participant
代码。
因此compareTo()
应该是:
@Override
public int compareTo(Participant o) {
return code.compareTo(o.code);
}
请注意,Comparable
javadoc表示:
强烈建议(尽管不是必需的)自然 顺序与等式一致。
有了这种更改,情况就会如此。
还请注意,如果您覆盖hashCode()
,也应该一致覆盖equals()
。