【问题标题】:Randomise selection from 2D Array从二维数组中随机选择
【发布时间】:2018-11-11 13:16:33
【问题描述】:

我正在尝试在 Android Studio 中创建一个基本的测验应用程序,但我对此还是很陌生,不确定使用什么术语来搜索解决方案。希望这里有人可以提供帮助。

用户可以从一系列主题、项目或两者的组合中进行选择,以定义他们的测验。 一旦他们完成了他们的选择,它就会随机化,他们的测验就开始了。

主题和项目是相关的,但没有明确关联。例如,用户可以只选择一个主题行,该行将提供与该主题相关的每个项目。或者他们可以选择一列项目,这将提供与该项目相关的每个主题。

我的假设是这必须通过 XML 中的二维数组来实现,like this picture. 选择绿色单元格,未选择红色单元格。然后在java中操作数组。

我知道如何创建 2D 数组,但我没有足够的经验来确定这是正确的决定。我也不确定如何操作它。我应该接受用户的选择并使用它来创建一个新数组吗?或者我可以保留原始数组,将数字随机化并跳过未选择的那些?

如果有人能指出我正确的方向,或提出更好的解决方案,将不胜感激!

【问题讨论】:

  • 从您的图像看来,主题和项目似乎是相互关联的,这是有道理的。如果是这种情况,单独使用某种类型的列表结构可能更易于可视化和使用,其中每个列表都是一个主题,每个主题的项目都包含在列表中。如果你必须有一个二维结构,也许像 List> listOfList = new ArrayList>();?
  • 主题和项目是相关的,但没有明确关联。例如,用户可以只选择一个主题行,该行将提供与该主题相关的每个项目。或者他们可以选择一列项目,这将提供与该项目相关的每个主题。

标签: javascript java android arrays android-studio


【解决方案1】:

下面的代码似乎将完成您想要对所选答案的二维数组中的所选项目执行的操作。至于我的评论建议为这些信息创建一个列表,这可能是也可能不是最好的选择,因为它是主观的。

让我们使用您已经想到的内容(因为您说您已经知道如何为被选择的项目创建一个 2D 数组),但是让我们将您的数组转换为 ArrayList,因为我确实觉得它们提供了更好的结构一起工作。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Collectors;

String[][] twoDimentionalArrayOfEverything = { 
        {"item1", "item2", "item3"}, 
        {"item4", "item5", "item6"}, 
        {"item7", "item8", "item9"} };

ArrayList<String> selectedItemsForQuiz = 
   Arrays.stream(twoDimentionalArrayOfEverything)
    .flatMap(a -> Arrays.stream(a))
    //filter selected items
    .filter(b->b.equals("item1") || b.equals("item9") )
    //now turn to a collection
    .collect(Collectors.toCollection(() -> new ArrayList<String>()));

    //loop the list
    selectedItemsForQuiz.forEach(System.out::println);  //item1 and item9 

这是一个使用整数值而不是字符串的版本

Integer[][] answerNumbers = { 
            {1, 2, 3}, 
            {4, 5, 6}, 
            {7, 8, 9} };

ArrayList<Integer> selectedItemsNumber = Arrays.stream(answerNumbers)
       .flatMap(a -> Arrays.stream(a))
        //filter selected items
        .filter(b->b.equals(1) || b.equals(9) )
        //now turn to a collection
       .collect(Collectors.toCollection(() -> new ArrayList<>()));

selectedItemsNumber.forEach(System.out::println);  //1 and 9 

毕竟,既然你说你想随机选择,洗牌应该可以从 Java 集合中工作:

Collections.shuffle(selectedItemsForQuiz);  //Strings
Collections.shuffle(selectedItemsNumber);  //Integers

【讨论】:

  • 感谢您抽出宝贵时间完成所有这些工作。里面有很多我不熟悉的方法,所以在确认答案之前,我会花一些时间来思考它们。
  • 现在担心@Samm...基本上我所做的只是使用流和 lambdas (Java 8) 来简化二维数组到随机选择答案的 ArrayList 之间的转换。创建 ArrayList 后,您所做的就是使用列表中收集的项目构建您的测验。 - 我对 lambdas 和流所做的一切都可以使用循环来完成,但我觉得没有循环的代码更易于阅读且不那么复杂
  • 我研究了 lambda,这对我来说是新的东西。在过去的一周里,我越来越不确定是否需要将数据存储在 2D 数组中。我真正需要的是以这种方式将数据概念化,以使其保持井井有条。目前我正在使用电子表格输入数据,然后将该电子表格转换为 JSON。目前我正在尝试弄清楚如何使用 JSON 来获得我想要的效果。
  • 如果您使用 Android(或实际上使用几乎任何语言),SQLite 是一个易于学习/实施的数据库。然后您不必担心在各种文件类型/数据结构之间解析数据,将其存储在数据库中,然后在需要时使用数据:tutorialspoint.com/android/android_sqlite_database.htm
  • SQLite 绝对是正确的决定。我花了一点时间来理解它,但这正是我想要的。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多