在我的java代码中,我随机选择一个数字并从我的数组中获取该数字所赋予的值/字符串。这样可以正常工作,但是在获取之后我想将数字存储在列表或数组中,然后当再次生成数字时,我可以检查数组或列表中是否存在该数字,以及是否可以选择另一个number,如果不匹配则显示array.xml中该数字的值/字符串。怎么能实现这一目标?我的代码是否正确实现了这一目标?
array.xml
<array name="OneTimesTables">
<item>1 x 1 = </item>
<item>1 x 2 = </item>
<item>1 x 3 = </item>
<item>1 x 4 = </item>
<item>1 x 5 = </item>
<item>1 x 6 = </item>
<item>1 x 7 = </item>
<item>1 x 8 = </item>
<item>1 x 9 = </item>
<item>1 x 10 = </item>
<item>1 x 11 = </item>
<item>1 x 12 = </item>
</array>
我的java代码
public class Test extends AppCompatActivity {
String[] MyArray;
TextView Questions;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
final List<String> PastQuestions = new ArrayList<String>();
MyArray = getResources().getStringArray(R.array.OneTimesTables);
Questions = (TextView)findViewById(R.id.RandomTestActivity_textView);
Button button = (Button)findViewById(R.id.RandomTestActivity_button);
int count = (new Random()).nextInt(12);
Questions.setText(MyArray[count]);
PastQuestions.add(MyArray[count]);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int count = (new Random()).nextInt(12);
if (MyArray[count].equals(PastQuestions)) {
int count2 = (new Random()).nextInt(12);
Questions.setText(MyArray[count2]);
PastQuestions.add(MyArray[count2]);
} else {
Questions.setText(MyArray[count]);
PastQuestions.add(MyArray[count]);
}
}
});
RandomiseArray();
}
private void RandomiseArray() {
ArrayList<String> list = new ArrayList<>();
for(String item: MyArray){
list.add(item);
}
Collections.shuffle(list);
}
}
答案 0 :(得分:1)
使用Set
,例如一个HashSet<Integer>
。集合提供快速检查以查看值是否已存在(contains()
)。
示例强>
Random rnd = new Random();
// Generate 5 unique numbers 0-9
Set<Integer> used = new HashSet<>();
for (int i = 0; i < 5; i++) {
int number = rnd.nextInt(10);
while (used.contains(number)) {
System.out.println("Skipping duplicate: " + number);
number = rnd.nextInt(10);
}
used.add(number);
System.out.println(number);
}
<强>输出强>
0
2
7
6
Skipping duplicate: 2
4
现在,如果您将耗尽可用数字列表,重试while
循环将开始旋转,随机搜索未使用的数字。
如果您知道自己将使用全部或大部分可用数字,最好只是将所有数字添加到列表中并随机播放,然后从列表中提取值。
// Generate random list of 10 unique numbers 0-9
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++)
list.add(i);
Collections.shuffle(list);
System.out.println(list);
<强>输出强>
[6, 2, 3, 5, 8, 0, 9, 1, 7, 4]
答案 1 :(得分:0)
我认为问题出现在这里。
int count = (new Random()).nextInt(12);
if (MyArray[count].equals(PastQuestions)) {
int count2 = (new Random()).nextInt(12);
Questions.setText(MyArray[count2]);
PastQuestions.add(MyArray[count2]);
} else {
Questions.setText(MyArray[count]);
PastQuestions.add(MyArray[count]);
}
如果您想确保该项目与您在PastQuestions中选择的任何项目不同,则需要将MyArray[count]
与PastQuestions
中的每个元素进行比较。同时,如果MyArray[count].equals(PastQuestions)
,您可能会随机选择一个数字,也许它可能会再次超过项目,因此您需要重新设计此部分以考虑这种情况。
一种解决方案可能满足您的要求:
所以
public class Test extends AppCompatActivity {
String[] MyArray;
TextView Questions;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
final List<String> PastQuestions = new ArrayList<String>();
MyArray = getResources().getStringArray(R.array.OneTimesTables);
Questions = (TextView)findViewById(R.id.RandomTestActivity_textView);
Button button = (Button)findViewById(R.id.RandomTestActivity_button);
//The current length of PastQuestions
int length = 0
int count = (new Random()).nextInt(12);
Questions.setText(MyArray[count]);
PastQuestions.add(MyArray[count]);
length++;
MyArray.remove(count);
//in order to access the length, you need a final variable
final int[] lengthAccessInListenr = {length};
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int count = (new Random()).nextInt(12-lengthAccessInListenr[0] );
Questions.setText(MyArray[count]);
PastQuestions.add(MyArray[count]);
lengthAccessInListenr[0]++;
MyArray.remove(count);
}
});
RandomiseArray();
}
private void RandomiseArray() {
ArrayList<String> list = new ArrayList<>();
for(String item: MyArray){
list.add(item);
}
Collections.shuffle(list);
}
}