【问题标题】:Randomize array of Strings, but without repeating elements [duplicate]随机化字符串数组,但不重复元素[重复]
【发布时间】:2014-10-20 19:27:12
【问题描述】:

我想问我应该如何在 Java 中实现一个方法,该方法从数组中获取所有元素并将它们打乱。像一副扑克牌一样思考。

这是我的尝试:

// a is an array of type String
public void randomize()
{
    for(int i=0; i<k; ++i)
    {
        int idx = new Random().nextInt(k);
        String random = (a[idx]);
        System.out.println(random);
    }
}

【问题讨论】:

  • 你想从头开始写吗?
  • 查看blog.codinghorror.com/the-danger-of-naivete 了解洗牌算法的讨论
  • 我想知道一个想法或解释的方法。 :)
  • 这里已经回答了 -> stackoverflow.com/questions/1519736/…
  • @Alnitak 它不完全是重复的:在另一个问题中,它是一个基元数组,而这里它是一个对象数组。特别是简短而甜蜜的Collections.shuffle(Arrays.asList(a)); 不适用于int[],但可以用于String[]

标签: java arrays random


【解决方案1】:

您可以使用Collections.shuffle()。首先将您的数组转换为列表

【讨论】:

  • 有效!太感谢了!我给了你+1!
  • 很高兴它成功了。您也可以接受它作为正确答案。
  • 是的。这是正确的答案。我不知道为什么一个人标记了我的问题......在问之前我看到了其他问题并且没有一个答案有效。不过非常感谢。我今天学到了新东西。 :)
【解决方案2】:

使用内置方法可能是最简单、最干净的解决方案:

Collections.shuffle(Arrays.asList(a)); //shuffles the original array too

这是因为asList method(强调我的):

返回一个固定大小的列表由指定的数组支持。 (对返回列表的更改“写入”到数组。)

【讨论】:

  • 有效!太感谢了!我给了你 +1!
【解决方案3】:

你的意思是像这样的东西?或者您正在寻找更复杂的东西?

static void shuffleArray(String[] ar)
  {
    Random rnd = new Random();
    for (int i = ar.length - 1; i > 0; i--)
    {
      int index = rnd.nextInt(i + 1);
      // Simple swap
      int a = ar[index];
      ar[index] = ar[i];
      ar[i] = a;
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多