Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法洗牌JSONArray_Java_Android - Fatal编程技术网

Java 无法洗牌JSONArray

Java 无法洗牌JSONArray,java,android,Java,Android,我试图洗牌一个JSONArray和一个get-a子集(JSONArray)。例如,如果我的JSONArray有5个条目,我想生成一个JSONArray,其中5个条目中随机有3个条目。 下面是洗牌JSONArray的代码。问题是输出JSONArray在每次出现双引号(“)之前都会引入反斜杠()字符。不知道为什么会出现这种情况。有人提供了帮助吗?还有关于如何从JSONArray中选择前3个随机条目(共5个)的建议吗 public JSONArray getRandomJSONArray(JSONAr

我试图洗牌一个JSONArray和一个get-a子集(JSONArray)。例如,如果我的JSONArray有5个条目,我想生成一个JSONArray,其中5个条目中随机有3个条目。 下面是洗牌JSONArray的代码。问题是输出JSONArray在每次出现双引号(“)之前都会引入反斜杠()字符。不知道为什么会出现这种情况。有人提供了帮助吗?还有关于如何从JSONArray中选择前3个随机条目(共5个)的建议吗

public JSONArray getRandomJSONArray(JSONArray jArray){
    List<String> stringArrayMaster = new ArrayList<String>(Arrays.asList(jArray.toString()));
    Collections.shuffle(stringArrayMaster);
    JSONArray randomJArray = new JSONArray(stringArrayMaster);
    return randomJArray;
 }
publicjsonarray getRandomJSONArray(JSONArray jArray){
List stringArrayMaster=newArrayList(Arrays.asList(jArray.toString());
集合。洗牌(stringArrayMaster);
JSONArray randomJArray=新的JSONArray(stringArrayMaster);
返回Jarray;
}

之所以添加\是因为JSON中的“有一个特殊的含义-它是字段的结尾。因此,要在字符串中包含一个“字符串”,您需要对其进行转义。\n用于转义。至于获取前3个条目——jsonArray.getString(0);jsonArray.getString(1);jsonArray.getString(2);作为奖励,这些应该是不可替换的,因为JSONArray知道java不需要转义

为什么不从JSONArray手动获取3个随机条目呢?假设JSONArray由JSONObject组成,您可以执行以下操作

JSONArray shuffled = new JSONArray();
Random r = new Random();
int size = jArray.length();
for(int i = 0; i < 3; i++){
    shuffled.put(jArray.getJSONObject(r.nextInt(size - 1)));
}
return shuffled;
JSONArray shuffled=newjsonarray();
随机r=新随机();
int size=jArray.length();
对于(int i=0;i<3;i++){
shuffled.put(jArray.getJSONObject(r.nextInt(size-1));
}
换位;
我的想法是创建一个新的JSONArray来保存随机项。在jArray的范围内生成一个随机数(0和数组大小-1),然后获取与该索引值对应的对象,并将其添加到新的无序集合中


这不会向混合中添加任何转义字符。

最终能够做到这一点。下面是代码。请注意,变量numQuestions包含我需要的数组子集大小的整数值。因此它jArray.length()为5,然后numQuestions为3(任何小于jArray.length()的数字)

JSONArray shuffled=newjsonarray();
ArrayList intArr1=新的ArrayList(jArray.length());

for(int i=0;iI在我上面的代码中jArray.toString()中没有任何\项。但是当我执行randomArray.toString()时,我在其中看到\项。如果toString操作插入转义字符,那么为什么jArray.toString()会没有。关于前3个条目,我实际上是指JSONArray中的前3个随机条目。好建议。我刚刚测试了这个。但是我看到JSONArray中重复了一个值“shuffled”。不知道为什么。例如,我的jarray说[“a”、“b”、“c”、“d”、“e”]然后,一个长度为4的随机数组
shuffle
具有值[“b”、“b”、“c”、“d”].我的jArray确实是由JSONObjectsAh组成的-我没有意识到你想要添加值而不是重复值。从5个值中选择x个随机值确实有可能重复某些值。只需添加一个条件来检查最后添加的值,而不是重复值。很高兴你已经找到了答案。
JSONArray shuffled = new JSONArray();   
    ArrayList<Integer> intArr1=new ArrayList<Integer>(jArray.length());
    for(int i = 0; i<jArray.length(); i++){
        intArr1.add(i);
    }
    Collections.shuffle(intArr1);
    for(int i = 0; i < intArr1.size(); i++){
        shuffled.put(i, jArray.get(intArr1.get(i)));
        if (i==(numQuestions-1))
                break;
    }
    return shuffled;