【问题标题】:An efficient way to shuffle a JSON array in java?在java中洗牌JSON数组的有效方法?
【发布时间】:2011-07-28 17:12:51
【问题描述】:

最好的方法是什么?现在,我将我的JSONArray 转换为自定义类的ArrayList,使用Collections.shuffle() 执行操作,然后再转换回JSONArray,这似乎开销太大。

答案可能只是实现一个 Fisher-Yates shuffle,但我的猜测是这可能已经完成,所以我想避免重新发明轮子。 我查看了标准的JSON apiGoogle's Gson,但它们似乎没有任何实现。

标准数组in this question 也有一些简单的选项,可以轻松移植到java,但我很乐意听到您的意见。我很惊讶http://www.google.com/search?q=java+shuffle+jsonarray 的查询没有用方法淹没我。

【问题讨论】:

  • “似乎开销太大” - 您是否对其进行了分析,或者这只是一个猜测?如果只是猜测,请对其进行分析,然后确定它是否真的是一个问题。
  • 我明白你的意思,但是现在数组非常小,所以不是很明显,但我想确保代码在数组数量(和大小)时保持可伸缩性增加。

标签: java arrays json shuffle


【解决方案1】:

您的方法效果很好,但不要忘记:

rnd.setSeed(System.currentTimeMillis());

这样每次的结果都是唯一的。

抱歉,我没有足够的代表发表评论:/

【讨论】:

    【解决方案2】:

    很抱歉发布我自己问题的答案,但现在,由于没有开箱即用的快速解决方案,我正在根据这篇文章中的代码实现我自己的静态随机播放功能:@987654321 @ .仍然期待听到有关最佳实施的消息。这就是我所做的:

    public static JSONArray shuffleJsonArray (JSONArray array) throws JSONException {
        // Implementing Fisher–Yates shuffle
            Random rnd = new Random();
            for (int i = array.length() - 1; i >= 0; i--)
            {
              int j = rnd.nextInt(i + 1);
              // Simple swap
              Object object = array.get(j);
              array.put(j, array.get(i));
              array.put(i, object);
            }
        return array;
    }
    

    【讨论】:

      【解决方案3】:

      当语言已经内置了非常好的ListMap 接口时,使用不需要您转换为某种 JSON 数据结构的 JSON 库。

      例如http://code.google.com/p/prebake/source/browse/trunk/code/src/org/prebake/js/JsonSink.javahttp://code.google.com/p/prebake/source/browse/trunk/code/src/org/prebake/js/JsonSource.java

      【讨论】:

      • +1 感谢您的链接。我会进一步研究它们,但似乎没有太多关于它的文档。
      猜你喜欢
      • 2011-11-10
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多