检查列表/数组中是否存在随机数

时间:2016-01-22 23:48:06

标签: java android arrays

在我的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);
}
}

2 个答案:

答案 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),您可能会随机选择一个数字,也许它可能会再次超过项目,因此您需要重新设计此部分以考虑这种情况。

一种解决方案可能满足您的要求:

  1. itemArray存储所有项目;
  2. 统计你选择了多少件物品; count = 0 initial
  3. 当点击按钮时,你随机得到一个数字:pick =(new Random())。nextInt( 12-count );
  4. 将item itemArray [pick]添加到您的PastQuestions。
  5. 从itemArray
  6. 中删除此项目

    所以

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