Java 从包含自定义类的ArrayList中删除重复元素
我有一个自定义类的Java 从包含自定义类的ArrayList中删除重复元素,java,sorting,arraylist,Java,Sorting,Arraylist,我有一个自定义类的ArrayListHighscore 数组列表包含多个高分 如下面的代码所示,存在重复条目。即,Highscore.add(新的Highscore(“用户1”,25))当我说duplicate时,我指的是相同的字符串(用户名)和int(分数)值 我希望能够检测到它,以便只有1个条目保留在ArrayList 代码: ArrayList<Highscore> highscores = new ArrayList<>(); highscores.add(new
ArrayList
Highscore
数组列表包含多个高分
如下面的代码所示,存在重复条目。即,Highscore.add(新的Highscore(“用户1”,25))
当我说duplicate时,我指的是相同的字符串
(用户名)和int
(分数)值
我希望能够检测到它,以便只有1个条目保留在ArrayList
代码:
ArrayList<Highscore> highscores = new ArrayList<>();
highscores.add(new Highscore("user 1", 25));
highscores.add(new Highscore("user 2", 10));
highscores.add(new Highscore("user 3", 55));
highscores.add(new Highscore("user 1", 25));
highscores.add(new Highscore("user 2", 5));
highscores.add(new Highscore("user 3", 30));
ArrayList highscores=新建ArrayList();
添加(新的高分(“用户1”,25));
添加(新的高分(“用户2”,10));
添加(新的高分(“用户3”,55));
添加(新的高分(“用户1”,25));
添加(新的高分(“用户2”,5));
添加(新的高分(“用户3”,30));
高分:
public class Highscore implements ConfigurationSerializable {
String username;
public int score;
public Highscore(String username, int score) {
this.username = username;
this.score = score;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public Map<String, Object> serialize() {
Map<String, Object> mappedObject = new LinkedHashMap<String, Object>();
mappedObject.put("username", username);
mappedObject.put("score", score);
return mappedObject;
}
public static Highscore deserialize(Map<String, Object> mappedObject) {
return new Highscore((String) mappedObject.get("username"),
(int) mappedObject.get("score"));
}
}
公共类Highscore实现了ConfigurationSerializable{
字符串用户名;
公众智力得分;
公共高分(字符串用户名、整数分数){
this.username=用户名;
这个分数=分数;
}
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
公共整数getScore(){
返回分数;
}
公共核心(整数分数){
这个分数=分数;
}
@凌驾
公共映射序列化(){
Map mappedObject=新建LinkedHashMap();
mappedObject.put(“用户名”,用户名);
mappedObject.put(“分数”,分数);
返回mappedObject;
}
公共静态Highscore反序列化(映射mappedObject){
返回新的Highscore((字符串)mappedObject.get(“用户名”),
(int)mappedObject.get(“score”);
}
}
我看到一些人建议使用HashSet或LinkedHashSet,但在我的例子中,这不起作用,因为它基于高分的id来识别重复项,这总是不同的
提前感谢:)
我看到一些人建议使用HashSet或LinkedHashSet,但在我的例子中,这不起作用,因为它根据Highscore的id识别重复项,这总是不同的
您可以通过重写equals
(和hashCode
)方法来定义“similiar”的含义。有关详细说明,请参见
如果您的要求是不允许基于类的属性进行重复,那么这是一个不错的选择。例如您必须重写equals
和hashCode
方法:
class Highscore {
private String username;
public int score;
//getters setters constructors
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Highscore highscore = (Highscore) o;
return score == highscore.score &&
Objects.equals(username, highscore.username);
}
@Override
public int hashCode() {
return Objects.hash(username, score);
}
}
然后:
Set<Highscore> highscores = new HashSet<>();
highscores.add(new Highscore("user 1", 25));
highscores.add(new Highscore("user 2", 10));
highscores.add(new Highscore("user 3", 55));
highscores.add(new Highscore("user 1", 25));
highscores.add(new Highscore("user 2", 5));
highscores.add(new Highscore("user 3", 30));
System.out.println(highscores.size());
Set highscores=new HashSet();
添加(新的高分(“用户1”,25));
添加(新的高分(“用户2”,10));
添加(新的高分(“用户3”,55));
添加(新的高分(“用户1”,25));
添加(新的高分(“用户2”,5));
添加(新的高分(“用户3”,30));
System.out.println(highscores.size());
将打印5
,并且不会添加重复条目。如果要保留插入顺序,请使用
当然,您也可以使用ArrayList
并通过调用删除元素,但它也使用equals
来比较下面的对象。我认为在这里使用Set
是可取的。在自定义类中重写equals和hashcode。谢谢!我从来没有想过使用equals()也解释得很好+1.