检查数组中的所有值是否不相等(java)

检查数组中的所有值是否不相等(java),java,arrays,Java,Arrays,对于我的代码,我想检查一个数组,它将被6个随机整数多次填充。 每次我都想检查是否所有6个值都不同,以及代码是否停止。 然而,在尝试使用循环之后,我遇到了一些问题,所以我只使用了一个长ASSIF语句来检查数组中的每个位置和其他位置。然而,这是行不通的。如果有人能告诉我为什么我这么愚蠢,我会很高兴的 if((diceArray[0] != diceArray[1] & diceArray[0]!=diceArray[2] & diceArray[0]!=diceArray[3] &a

对于我的代码,我想检查一个数组,它将被6个随机整数多次填充。 每次我都想检查是否所有6个值都不同,以及代码是否停止。 然而,在尝试使用循环之后,我遇到了一些问题,所以我只使用了一个长ASSIF语句来检查数组中的每个位置和其他位置。然而,这是行不通的。如果有人能告诉我为什么我这么愚蠢,我会很高兴的

if((diceArray[0] != diceArray[1] & diceArray[0]!=diceArray[2] & diceArray[0]!=diceArray[3] & diceArray[0]!=diceArray[4] & diceArray[0]!=diceArray[5] & diceArray[1]!=diceArray[2] & diceArray[1]!=diceArray[3] & diceArray[1]!=diceArray[4] & diceArray[1]!=diceArray[5] & diceArray[2]!=diceArray[3] & diceArray[2]!=diceArray[4] & diceArray[2]!=diceArray[5] & diceArray[3]!=diceArray[4] & diceArray[3]!=diceArray[5] & diceArray[4]!=diceArray[5]))

                {
                    System.out.println("stop babes");
                }
                else
                {
                    System.out.print("Did not work");
                }
这段代码还有更多内容,但我知道其余部分都可以工作,因为当我打印出每个序列时,它们都不会有问题。当我运行这个部分的代码时,理想情况下,它会打印出许多具有重复编号的序列,这些打印结果“不起作用”,其中一个结果应该显示为“停止宝贝”(这些将在稍后使用它们进行测试并返回用于停止代码),但是当我运行代码时,会发生这种情况

how many rolls of 6 dice? 3
LINE 1
 4 1 3 5 5 5
stop babes
LINE 2
 4 4 1 2 6 1
stop babes
LINE 3
 3 6 4 6 4 4
stop babes
只需对if语句进行快速编辑即可。我意识到它可以缩短为一个快速循环,我只是想强行解决这个问题。
主要问题是,只有在打印出代码(如123456)时,才会打印文本“stop babes”。该代码通知我代码正常工作,并允许我在主FOR循环上插入break语句。

考虑使用FOR循环,而不是巨型if语句:

for (int i = 0; i < 6; i++)
{
    for (int j = i + 1; j < 6; j++)
    {
        if (diceArray[i] == diceArray[j])
            System.out.println("Did not work!");
    }    
}
for(int i=0;i<6;i++)
{
对于(int j=i+1;j<6;j++)
{
if(diceArray[i]==diceArray[j])
System.out.println(“不工作!”);
}    
}

此外,最好使用
&
运算符进行逻辑AND,而不是
&
,因为
&
短路-它将在计算为false的条件的第一部分停止并返回false,而
&
将计算所有条件,因此效率较低。

我相信您希望&&vs&


一个是按位操作,另一个是逻辑操作。

这应该适用于您:

public static bool areValuesUnique( int[] values )
{
    for( int i = 0; i < values.length; ++i )
    {
        for( int j = i + 1; j < values.length; ++j )
        {
            if( values[i] == values[j] )
                return false;
        }
    }
    return true;
}

我认为您需要使用Set来验证数组中是否存在任何equals对象。您只需使用数组中包含的对象创建新的HashSet,然后验证创建集的长度。若长度等于数组的长度,则所有对象都不同

Set<YOUR_ARRAY_TYPE> set = new HashSet<YOUR_ARRAY_TYPE>();
set.addAll(Arrays.asList(YOUR_ARRAY));
if (set.size() == YOUR_ARRAY.length)
{
    ...
}
else
{
    ...
}
Set Set=newhashset();
set.addAll(Arrays.asList(您的_数组));
if(set.size()==您的_ARRAY.length)
{
...
}
其他的
{
...
}

另一种方式,有点有趣,使用位屏蔽。这就是我们过去的生活方式

// watch out: only works for dice values 0-30
public static boolean areDiceUnique(int[] diceArray) {
  int mask=0;
  for(int i=0; i<diceArray.length; i++) {
    int orMask = 1<<diceArray[i];
    if((mask & orMask) != 0)
      return false;
    mask |= orMask;
  }
  return true;
}
//小心:仅适用于骰子值0-30
公共静态布尔值areDiceUnique(int[]diceArray){
int-mask=0;

对于(int i=0;i),如果您的最终目标是删除重复的序列,则应考虑在填充时检查数组:

而不是像这样做(你没有提供代码,所以我只是猜测):

做一些类似于:

n = rand.nextInt();
for ( int i = 0; i < nextPosition; i++ ) {
    if ( diceArray[i] == n ) {
        return;  // Or whatever will cause the array to be disqualified.
    }
}

这是不正确的。在布尔上下文中,&表示“正常”,而&&表示“快速”,如果一个表达式为“false”,则会中断。我不确定哪里不正确,因为即使Java文档也显示一个是按位的,另一个是逻辑的。“一个是按位的,另一个是逻辑的”但它们都表示AND运算符。对于布尔参数,一个是短路(&&),另一个不是(&)。它们也有不同的优先顺序。因此,在从左到右读取的等式中,如果使用&vs&&@Wranorn,很容易得到不同的结果。@Wranorn.您是对的,Oracle Java教程没有提到&作为逻辑运算符。但是,Java语言是在中定义的,并且在那里(第15.22.2段)&定义为逻辑运算符(当操作数为布尔值时)。尽管到目前为止有所有的答案和评论,
&
是一个有效的布尔/逻辑运算符;它只是不像
&&
那样短路。我以前有过&&&但在故障排除时更改了它。不起作用你通常会得到
&
更好的服务,所以你应该使用它。有更好的方法解决你的问题,不过,我相当肯定
diceArray[0]==diceArray[0]
这将是内部looop的第一次迭代。实际上,目的是计算获得一个没有任何重复的序列所需的次数。非常好,它也适用于此。我编辑了我的答案,向您展示了计算重复数组数量的代码,而不实际填充它们。您是我的朋友!这对我来说非常有效。非常类似于我正在做的事情,但使用起来更简单。很容易就能适应我的需要。还有,我该如何回答这个问题?我是新来的:DUsing set就像拿着大锤敲开坚果一样。@Turing85当然,你有权发表你的意见。但在性能不关键的情况下l、 利用像这样的集合的属性可以生成易于阅读和维护的代码。这个答案中的代码显然是正确的(尽管比必要的更详细);与使用“for”循环的解决方案相比,这需要更多的检查来验证。我从来没有说过,代码是不正确的,但是出于这个目的(这是一个针对试图学习Java的人的练习)只是有点太多了。可读性是一个意见问题:)
n = rand.nextInt();
diceArray[nextPosition++] = n;
n = rand.nextInt();
for ( int i = 0; i < nextPosition; i++ ) {
    if ( diceArray[i] == n ) {
        return;  // Or whatever will cause the array to be disqualified.
    }
}
    Random rand = new Random();
    int[] diceArray = new int[6];

    int badArrays = 0;
    int nextPosition = 0;

    while ( nextPosition < 6 ) {

        boolean goodMove = true;
        int n = rand.nextInt(6) + 1;
        for ( int i = 0; i < nextPosition; i++ ) {
            if ( diceArray[i] == n ) {
                goodMove = false;
                break;
            }
        }
        if ( goodMove ) {
            diceArray[nextPosition++] = n;
        } else {
            nextPosition = 0;
            badArrays++;
        }
    }

    System.out.println( "Got the array: " + Arrays.toString(diceArray)
                        + " after " + badArrays + " failures." );