Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从包含自定义类的ArrayList中删除重复元素_Java_Sorting_Arraylist - Fatal编程技术网

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.