选择随机数据时如何确保独特的结果?

时间:2011-06-27 23:07:52

标签: android xml random

我正在使用XML来存储短语数据库,其中一次将向用户显示其中5个短语。我需要确保这5个短语是独一无二的,当然,只是获取随机数据无法确保。我想我可以做到这一点,如果我可以将我正在使用的字符串数组转换为List,但我找不到如何做到这一点的好信息。有人对此有任何意见吗?

public String getResults(){
    // Get a random string from our results XML and return the string.

    Resources r = getResources();
    String[] resultsList = r.getStringArray(R.array.bossResults); 
    List<String> resultsArrayList = new ArrayList<String>(Arrays.asList(resultsList));      
    //ArrayList resultsArrayList = ;
    String q = resultsList[rgenerator.nextInt(resultsList.length)];
    return q;
    //resultsList.remove(q);

}
    private OnClickListener mAddListener = new OnClickListener() 
{
    public void onClick(View v) 
    {

    //Declare our TextViews for population from the random results from XML
        TextView t1 = new TextView(getApplicationContext());
        t1=(TextView)findViewById(R.id.textView1); 
        TextView t2 = new TextView(getApplicationContext());
        t2=(TextView)findViewById(R.id.textView2);
        TextView t3 = new TextView(getApplicationContext());
        t3=(TextView)findViewById(R.id.textView3);
        TextView t4 = new TextView(getApplicationContext());
        t4=(TextView)findViewById(R.id.textView4);
        TextView t5 = new TextView(getApplicationContext());
        t5=(TextView)findViewById(R.id.textView5);

        // Get a random result for each textview
        String result1 = getResults();
        String result2 = getResults();
        String result3 = getResults();
        String result4 = getResults();
        String result5 = getResults();
}
}

3 个答案:

答案 0 :(得分:0)

最简单的方法是记住您已经选择了哪些项目,如果再次选择其中一项,则只需丢弃它。如果可供选择的项目数量很少,这可能会非常慢。如果是这种情况,您可以shuffle整个数组并返回前n个项目。

答案 1 :(得分:0)

我会对getResults()进行更改,以便在一次传递中为您完成所有工作。通过这种方式,它可以记住已经选择了哪些值,并缩小了将来从中选择的值......就像这样:

public List<String> getResults(int count) {
    List<String> results = new ArrayList<String>();

    Resources r = getResources();
    String[] resultsList = r.getStringArray(R.array.bossResults); 
    List<String> resultsArrayList = new ArrayList<String>(Arrays.asList(resultsList));      

    for(int i = 0; i < count; ++i) {
        int next = rgenerator.nextInt(resultsArrayList.size());
        String nextVal = resultsArrayList.remove(next);
        results.add(nextVal);
    }

    return results;
}

答案 2 :(得分:0)

最简单的方法可能是重写getResults()以返回所需的所有字符串(并且不再加载“bossResults”数组5次)。

public List<String> getResults(int count){
  // Get a random string from our results XML and return the string.
  List<String> ret = new ArrayList<String>();
  Resources r = getResources();
  List<Integer> picked = new List<Integer>();
  String[] resultsList = r.getStringArray(R.array.bossResults); 
  while (ret.size() < count) {
    int i = rgenerator.nextInt(resultsList.length);
    if (picked.contains(i)) { continue; }
    picked.add(i);
    ret.add(resultsList[i]);
  }
  return ret;
}

count的大值可能会很慢。

编辑:如果count大于数组的大小,则会陷入无限循环!