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

时间:2014-11-05 22:06:05

标签: java arrays

对于我的代码,我想检查一个将用6个随机整数填充多次的数组。 每次我想检查是否所有6个值都不同,以及是否会发生代码停止。 但是在尝试使用循环之后我遇到了问题,所以我只使用了一个长的if if语句来检查数组中每个位置的位置。但是这不起作用。如果有人能告诉我为什么我是愚蠢的话会爱。

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语句即可。我意识到它可以缩短为快速循环我只是想强行解决问题。 主要问题是文字"停止辣妹"应该只打印一个代码,如1 2 3 4 5 6,通知我代码工作,并允许我在主FOR循环上插入一个break语句。

6 个答案:

答案 0 :(得分:2)

这应该适合你:

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

你可以像这样使用它,并且可以使用任何大小的数组。

if( areValuesUnique( diceArray ) )
{

}
else
{

}

答案 1 :(得分:1)

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

Set<YOUR_ARRAY_TYPE> set = new HashSet<YOUR_ARRAY_TYPE>();
set.addAll(Arrays.asList(YOUR_ARRAY));
if (set.size() == YOUR_ARRAY.length)
{
    ...
}
else
{
    ...
}

答案 2 :(得分:0)

考虑使用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!");
    }    
}

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

答案 3 :(得分:0)

另一种方式,有点好玩,使用位屏蔽。这就是我们过去的发展方式。

// 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;
}

如果您只是寻找独特的骰子卷,那么只需从List<Integer>开始,1,2,3,4,5,6和while(list.size()>0)获取{{1}处的项目}。

答案 4 :(得分:0)

如果你的最终目标是删除有重复的序列,你应该考虑在填充它时检查数组:

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

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.
    }
}

通过这种方式,您可以保存自己无法使用的滚动数字。假设你滚动了2 2。你已经知道你必须取消这个数组的资格,你不需要继续滚动到2 2 1 3 4 5然后循环整个事情并最终取消它的资格。

如果你想计算好阵列之前得到的坏数组的数量,也是如此。

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

答案 5 :(得分:-2)

我相信你想要&amp;&amp;与&amp;

一个是按位操作,而另一个是合乎逻辑的。