我正在写一段关于与来自不同城镇的候选人进行面试的代码。为此,我使用HashMap和TreeSet。现在,TreeSet不能包含重复的obj,因为在参与者类中ive重载等于方法。不过,无论怎么说,这个场景都会添加它们。有什么办法能解决这个问题吗?
我试过任何我能想到的东西,也找不到与我的问题相关的帖子。
守则:
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代码是用西里尔(不重要)写成的。
发布于 2019-01-06 21:38:46
根据您的预期,您的compareTo()方法是不正确的。
您希望在您的期望中有不同的Participant代码。
因此,compareTo()应该是:
@Override
public int compareTo(Participant o) {
return code.compareTo(o.code);
}请注意,Comparable javadoc说:
强烈建议(虽然不是必需的)自然秩序与平等一致。
有了这一变化,情况就会如此。
还请注意,如果您重写了hashCode(),那么equals()也应该是一致的。
发布于 2019-01-06 21:23:19
TreeSet不使用equals来确定两个对象是否相等。相反,它使用compareTo,如果等于零,它认为这两个对象是相等的。
因此,您需要确保您在equals中比较的内容与在compareTo中比较的内容匹配。
https://stackoverflow.com/questions/54065998
复制相似问题