Java 如何检查一个数组中的所有元素是否存在于另一个数组中,并且没有重复项?

Java 如何检查一个数组中的所有元素是否存在于另一个数组中,并且没有重复项?,java,Java,我的代码遇到了一些麻烦,想检查sharedMemory是否存在于整个数据组中,并且没有对象的副本。我对这段代码的理解是错误的,我真的不知道为什么,任何帮助都将不胜感激。等级和套装一起构成一个卡片对象。等级和卡片是具有值的枚举数。注意:当我单独使用“returnarrays.asList(entireDeck).containsAll(sharedMemory)”时,它确实显示为true,但如果部件试图检查重复项,则会出现混乱 public static boolean isFull(){

我的代码遇到了一些麻烦,想检查sharedMemory是否存在于整个数据组中,并且没有对象的副本。我对这段代码的理解是错误的,我真的不知道为什么,任何帮助都将不胜感激。等级和套装一起构成一个卡片对象。等级和卡片是具有值的枚举数。注意:当我单独使用“returnarrays.asList(entireDeck).containsAll(sharedMemory)”时,它确实显示为true,但如果部件试图检查重复项,则会出现混乱

 public static boolean isFull(){
        Card[] entireDeck = Deck.fillDeck();
        sharedMemory =Arrays.asList(Deck.fillDeck());
        int i=0,duplicates=0, position =0, original;
        for(Card c:entireDeck){
            Card f = new Card(c.rank, c.suit);
            original=i;
            if (f.rank.equals(sharedMemory.get(i).rank)&&f.suit.equals(sharedMemory.get(i).suit)){
                duplicates+=1;
                position=i;
                for(i=0; i<position;i++) {
                    if (f.rank.equals(sharedMemory.get(i).rank)&&f.suit.equals(sharedMemory.get(i).suit)) 
               {
                        duplicates += 1;
                        return false;
                    }
                }
                for (i=position+1; i<52; i++){
                    if (f.rank.equals(sharedMemory.get(i).rank)&&f.suit.equals(sharedMemory.get(i).suit)) 
              {
                        duplicates += 1;
                        return false;
                    }
                }
                if(duplicates>1){
                    return false;
                }
                else{
                    i=original;
                }

            }
            i=original;
            i++;
        }
        return Arrays.asList(entireDeck).containsAll(sharedMemory);
    }
publicstaticbooleanisfull(){
卡片[]entireDeck=Deck.fillDeck();
sharedMemory=Arrays.asList(Deck.fillDeck());
int i=0,副本=0,位置=0,原始;
用于(卡c:EntiredCheck){
卡f=新卡(c级,c级);
原始=i;
if(f.rank.equals(sharedMemory.get(i.rank))和&f.suit.equals(sharedMemory.get(i.suit)){
重复数+=1;
位置=i;

对于(i=0;i而言,最简单的方法是使用
Set
。如果向集合添加对象的返回值为
false
,则表示该集合已包含该对象,因此是一个副本。为此,
Card
类必须同时覆盖
hashCode
equals

Set<Card> set = new HashSet<>();
for(Card card : cardArray) {
    if (!set.add(card)) { // if false then !false is true so signal duplicate.
        System.out.println("Duplicate of " + card + " found);
        break;
    }
}
Set Set=newhashset();
用于(卡:cardArray){
如果(!set.add(card)){//如果为false,则!false为true,因此信号重复。
System.out.println(“找到“+卡+”的副本);
打破
}
}

您始终可以对卡片进行排序,然后进行一对一比较以查看它们是否相等。比较已排序卡片组的相邻卡片也可以检测重复的卡片。

以下是一个使用整数数组实现此目的的示例。对于您的用例,您可能希望实现一个用于排序和排序的比较器

我决定展示一种在检查过程中修改输入数组的方法(通过每次运行对它们进行排序)。这允许适度的性能改进,但是我怀疑您的用例是否会使用足够大的数据集作为考虑因素

//检查a是否是b的子集且不包含重复项
公共静态布尔子集(int[]a,int[]b){
数组。排序(a);
数组。排序(b);
int aIdx=0;
int-bIdx=0;
while(aIdx
对于您的用例,为了可读性,我推荐类似这样的内容

导入java.util.array;
导入java.util.Set;
导入java.util.HashSet;
公共静态布尔子集(卡[]a,卡[]b){
Set aSet=newhashset();
Set bSet=new Hashset();
aSet.addAll(Arrays.asList(a));
bSet.addAll(Arrays.asList(b));
返回aSet.size()==a.length&&bSet.containsAll(aSet);
}
要使用此方法,请确保在卡中实现
hashCode
equals
。您不需要做任何花哨的事情或导入任何额外的库。重要的是,它为每个等级/套装组合返回不同的数字

公共类卡{
//为每张卡提供一个唯一的编号
@凌驾
公共int hashCode(){
返回4*rank+suitNum;
}
//检查此卡是否与其他对象相同
@凌驾
公共布尔等于(对象其他){
if(卡的其他实例){
卡其他卡=(卡)其他;
返回等级==otherCard.rank&&suitNum==otherCard.suitNum;
}
返回false;
}
}

和套装的数据类型是什么?它们是字符串还是像整数之类的原语,还是对象?请注意,在比较(
.equals
)时两个独立的对象,即使对象包含完全相同的数据,它们也不会匹配。请参见此处:@SoriFindTorry rank and suit一起构成一个card对象。rank和card是具有值的枚举数。注意:当我使用“return Array.asList(EntiredCheck).containsAll(sharedMemory)时'就其本身而言,它确实显示为真,但凌乱的if部分试图检查重复项'must overridve thashcode and equals'不是真的,它应该是真的。如果您使用的是相同的(相同,==)对象,您可以保持Card类不变。也就是说,请查看一个好的详细答案,以避免麻烦。假设相同的两张卡是相同的对象不是一个好主意。
if
不是一个假设;-)@JayC667感谢您提供的信息,不幸的是,这是一个家庭作业,无法使用HashCodeBuilder所在的Apache库…任何方法都可以解决此问题?此外,我还有许多其他类使用。equals,它们工作正常,为什么会有所不同?@BigJamo。如果您总是对任何给定的卡使用相同的对象,那么您不需要过度使用de
hashCode
equals
,正如@JayC667所暗示的那样。但是如果你创建了两张卡,比如说“钻石王牌”,并对它们进行比较,它们将被认为是不相等的,除非你覆盖equals和hashCode来精确比较它们的值。