我正在创建一个简单的应用程序,您必须切换按钮/布尔值,以尝试猜测正确的组合。我想知道最简单的方法来比较切换布线器和#34;右边#34;组合。例如,如果用户具有:
布尔1:真实 布尔值2:假
布尔值3:true
但正确的组合是:
布尔1:真实 boolean 2:true
布尔值3:true
我希望用户看到一条消息,说明你有3个正确。我有
public void go(View view){
if (bool1 == true && boo12 == true && bool3 == true) {
// do this
} else {
// display the correct amount of booleans the user has correct.
}
}
答案 0 :(得分:2)
为正确的组合创建BitSet
(设置对应于“true”的位,清除对应于“false”的位。)
如果要检查用户的输入,请从按下的按钮创建BitSet
(设置为“true”,清除“false”)。
可以使用correctValue.equals(usersAttempt)
检查正确性。
可以通过usersAttempt.xor(correctValue)
获取计数,然后usersAttempt.cardinality()
将返回不正确的值的数量。
这需要极少量的编码。以你的例子:
// Correct: [true,true,true]
BitSet correct = new BitSet(3);
correct.set(0); // <= true
correct.set(1); // <= true
correct.set(2); // <= true
// User's attempt (buttonN.isChecked() is just placeholder, drop in whatever
// code you actually use to get the state of your buttons):
BitSet attempt = new BitSet(3);
attempt.set(0, button0.isChecked()); // <= true in your example
attempt.set(1, button1.isChecked()); // <= false in your example
attempt.set(2, button2.isChecked()); // <= true in your example
// Check answer (produces false in your example):
boolean matchIsPerfect = attempt.equals(correct);
// Get the count (produces 1 in your example):
attempt.xor(correct);
int incorrectCount = attempt.cardinality();
// To get the correct count just subtract 'incorrectCount' from total.
// Another way to check if attempt is correct is 'if (incorrectCount == 0)'.
// Note that the remaining bits set in 'attempt' after the above xor()
// will correspond to the individual inputs that weren't correct.
这将允许您支持任何大小,代码清晰,您不需要自己做任何逻辑。请注意,您可以简化按钮 - &gt;用户的尝试设置,如果您有一个按钮数组或可以访问给定索引的用户输入。
答案 1 :(得分:1)
如果条件并非总是如此,那么说bool3需要是假的,你可以使用这样的东西。否则,正如提到的其他答案一样,数组可能效果最好。
int correctCount = 0;
if (bool1) correctCount++;
if (bool2) correctCount++;
if (!bool3) correctCount++;
if (correctCount == 3) {
// do this
} else {
Toast.makeText(context, String.valueOf(correctCount) + " out of 3 correct", Toast.LENGTH_LONG).show();
}
答案 2 :(得分:1)
假设您的“正确”组合将同时包含true
和false
值,则以下方法将返回匹配数,如果数组长度不匹配,则返回-1
:
private int getMatches(boolean[] toggleValues, boolean[] matchPattern)
{
if(toggleValues.length != matchPattern.length)
return -1;
int matches = 0;
for (int j = 0; j < toggleValues.length; j++)
{
if(toggleValues[j] == matchPattern[j])
{
matches++;
}
}
return matches;
}
例如,如果您有3个ToggleButton
,tb1
,tb2
和tb3
,则以下内容将返回2:
tb1.setChecked(true);
tb2.setChecked(false);
tb3.setChecked(false);
final boolean[] matchPattern = {true, false, true};
final boolean[] toggleValues = {tb1.isChecked(), tb2.isChecked(), tb3.isChecked()};
int matches = getMatches(toggleValues, matchPattern);
此方法可让您轻松更改匹配模式而无需更改代码,例如将存储的值从文件或matchPattern
读入SharedPreferences
数组。
答案 3 :(得分:0)
你可以这样做,因为布尔值的数量可以大于3.你可能想要使用for循环(简单方法)并在值的末尾迭代它并将计数数返回到值k 。这里k-> true布尔值的数量,b是包含布尔值数组的数组。
public void go(View view){
boolean b[]={bool1,bool2,bool3,bool4,bool5,bool6,bool7,bool8,bool9,bool10};
int k=0;
for(int i=0;i<b.length;i++)
{
if(b[i]==true)
{
k++;
}
}
if(k==b.length)
{
do task
}
else
{
Toast.makeText(getApplicationContext(), k+ "out of "+b.length+ "correct",Toast.LENGTH_LONG).show();
}
}