对于我的代码,我想检查一个将用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语句。
答案 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;
一个是按位操作,而另一个是合乎逻辑的。