【问题标题】:How do you stop duplicate outputs from an array?如何停止数组中的重复输出?
【发布时间】:2010-11-07 07:39:18
【问题描述】:

我有一个单词数组。当活动启动时,它会显示一个单词,然后当您单击屏幕时,它会显示数组中的另一个随机单词。我能够做到这一点(在一些帮助下),但我有点卡住了。当您单击屏幕显示一个新单词时,如何确保该单词尚未从数组中显示出来。这是我目前所拥有的。

private String[] myString;
public static final Random rgenerator = new Random();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.study);

    //Takes a random item from array and creates string
    Resources res = getResources();
    myString = res.getStringArray(R.array.list);
    String q = myString[rgenerator.nextInt(myString.length)];

    //Displays random array string in TextView
    TextView wordTextView = (TextView) findViewById(R.id.word);
    wordTextView.setText(q);

    //Set up click listener for new word
    View newWord = findViewById(R.id.word);
    newWord.setOnClickListener(this);

}

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.word:
        //Takes a random item from array and creates string
        String q = myString[rgenerator.nextInt(myString.length)];

        //Displays random array string in TextView
        TextView wordTextView = (TextView) findViewById(R.id.word);
        wordTextView.setText(q);
    }
}

【问题讨论】:

    标签: android arrays string duplicates


    【解决方案1】:

    如果你考虑到这一点,你有两种方法可以做到:

    1. 显示单词后,将其从列表中删除。然后,下次您从列表中选择一个随机单词时,它就不会出现了。这仅在您有可以修改的列表时才有效。
    2. 跟踪您已经显示的字词,如果您碰巧选择了之前选择的字词,只需选择另一个字词

    【讨论】:

    • 是的,我猜这些是我的选择。我是 android 编程的新手,所以我不确定是否实现任何一个选项。如果我有一个起始位置,我可以弄清楚。有什么想法吗?
    • 嗯,这只是 java,所以您可以使用 ArrayList,来保存您的单词列表并删除项目,或者保存您已显示的单词列表。您是 Android 编程新手还是一般编程新手?
    • Android 编程新手和编程新手。我是一名网络开发人员,所以我对 javascript 和 xml 有一定的经验,但即便如此,没有 html 或 css 的编程对我来说还是个新手。
    • 我建议不要使用 #2。如果你从一个大列表开始,比如长度为 50,然后减少到剩下的 ~2 个字符串,你会发现获取随机值需要一段时间。有 96% 的机会必须再次选择新字符串,这意味着您可能希望在获得有效答案之前进行 25 次随机选择。这显然是一种特殊情况,但我建议不要这样做,因为这是一种良好的做法/习惯。
    • @Matt - 同意。我看过一篇基于这样做的人的dailywtf文章。尽管“选择另一个”的方式可能与仅选择另一个随机数不同。
    【解决方案2】:

    我的建议是使用ArrayList。如果要保留内容,则可能需要 2 个 ArrayList。

    其实很简单:

    List wordsList = new ArrayList<String>();
    List usedList = new ArrayList<String>();
    
    String s = wordsList.get(rgenerator.nextInt(wordsList.size()));
    
    wordsList.remove(s);
    usedList.add(s);
    

    第二个列表是可选的,具体取决于您是否想要列出您使用过的单词。如果您不需要它,那么您可以删除“usedList”行。如有错误请见谅。写的有点仓促。无论哪种情况,在 Javadocs 中查找 ArrayList,您都会更好地理解它。您实际上是从 ArrayList 中删除字符串,因此在这种情况下您不必担心重复。

    【讨论】:

    • 谢谢。那是很多帮助/。我可以在 array.xml 中写出列表并将其调用到列表中吗?如果是这样,我是使用数组、字符串数组还是其他方式?
    猜你喜欢
    • 2018-07-10
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2022-01-21
    • 1970-01-01
    • 2023-04-02
    • 2023-03-12
    相关资源
    最近更新 更多