代码之家  ›  专栏  ›  技术社区  ›  Luke C

从包含自定义类的ArrayList中删除重复元素

  •  0
  • Luke C  · 技术社区  · 5 年前

    我有一个 ArrayList 自定义类的 Highscore 数组列表包含多个 高分

    如下面的代码所示,有一个重复条目。那就是, highscores.add(new Highscore("user 1", 25)); 当我说重复的时候,我的意思是一样的 String (用户名)和 int (得分)值

    我希望能够检测到它,这样只有一个条目留在 数组列表

    代码:

    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));
    

    高分:

    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"));
        }
    }
    

    我见过一些人建议使用hashset或linkedhashset,但在我的例子中,这不起作用,因为它根据 高分 ,这总是不同的。

    提前谢谢:)

    1 回复  |  直到 5 年前
        1
  •  1
  •   Michał Krzywański    5 年前

    我见过一些人建议使用hashset或linkedhashset,但在我的例子中,这不起作用,因为它根据高分的id来标识重复项,而高分的id总是不同的。

    你定义“相似”的意思是 equals (和) hashCode 方法。详细解释见 this .

    如果您的要求是基于类的属性不允许重复- Set 是个不错的选择。例如 HashSet . 你必须超越 等于 哈希码 方法:

    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());
    

    将打印 5 并且不添加重复条目。如果要保留插入使用顺序 LinkedHashSet .

    当然你也可以用你的 ArrayList 并通过调用 List::remove(object) 但它使用 等于 比较下面的物体。我认为使用 集合 这是明智的。