【问题标题】:How to return true if there is a duplicate object in ArrayList?如果ArrayList中有重复的对象,如何返回true?
【发布时间】:2014-02-03 08:50:07
【问题描述】:

用 Java 编写一个方法来查看已填充随机卡片的对象(特别是“卡片”对象,其中包含卡片的数量和花色)的 ArrayList。该方法返回一个布尔值 ArrayList 是否包含重复项。

到目前为止,我已经在 for 循环中尝试了 for 循环,但我没有走得太远。

另外,我需要另一种返回重复卡的方法,但我需要先完成第一种方法,然后再尝试。

【问题讨论】:

  • 发布你到目前为止所拥有的...
  • 创建其中一个列表的临时副本,然后使用removeAll 传入第二个列表,如果大小发生变化,则您有重复的项目...
  • 不要对它们进行排序并一一比较!
  • 当您说重复时,您的意思是仅排名吗?标准套牌中没有相同等级和花色的牌。

标签: java eclipse arraylist boolean duplicates


【解决方案1】:

这是您通常会找到重复项的方式:

public static bool findDuplicates(List<Card> listContainingDuplicates) {

        final Set<Card> set1 = new HashSet<Card>();

        for (Card yourCard : listContainingDuplicates) {
            if (!set1.add(yourCard)) {
                return true;
            }
        }
        return false;
    }

【讨论】:

    【解决方案2】:

    看看这个:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html 你可以只使用 indexOf 和 lastIndexOf。

    在伪代码中:

    myfunct(list, obj){
        if(list.indexOf(obj) == list.lastIndexOf(obj))
            return False;
        else
            return True; // Two or more ...
    }
    

    【讨论】:

    • 方法应该检查是否有 a 重复。
    • 啊,我的错……我用 hashmap 然后
    • 我想你只需要把它放在一个循环中并停在第一个true。我喜欢这个想法本身。它不需要额外的空间,但可能会很赶时间。
    【解决方案3】:

    如果您的算法空间有限,请对列表进行排序,然后在线性时间内查找重复值。该算法的总时间复杂度为O(nlogn)。

    public boolean hadDuplicatedCards(List<Card> cards) {
            Collections.sort(cards);
            for (int i = 0; i < cards.size() - 1; i++) {
                if(cards.get(i).equals(cards.get(i+1))) {
                    return true;
                }
            }
            return false;
        }
    

    否则,newHashSetadd 一张一张的卡片,如果 HashSet 中已经存在相同的卡片,add 方法将返回 true

    顺便说一句,在排序方法中,您的Card 类需要实现Comparable 接口,并且不要忘记覆盖equals 方法。 在HashSet 方法中,您只需覆盖equals 方法。但请注意,HashSet 方法需要额外的 O(n) 空间。

    感谢 PM 77-1 的 cmets。

    【讨论】:

    • 正如 OP 所述:“...“卡片”对象,其中包含卡片的数字和花色”。所以要让你的方法工作Card需要实现Comparable接口。
    • 不。对于HashSet 方法,我们只需要equals 方法,我们可以合理地期望一个类拥有它。这里不需要Comparable
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2013-05-23
    • 2019-11-26
    相关资源
    最近更新 更多