【问题标题】:Take chars from array and place them randomly to create String从数组中获取字符并将它们随机放置以创建字符串
【发布时间】:2011-10-28 19:38:51
【问题描述】:

我有一个 char 数组(大小为 12),看起来像这样:

{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'}  

我想(以最有效的方式)创建一个字符串,它是从数组中获取字符并随机排序它们的结果(让我们使用那个词),例如:

“ahbejclfkdig”

我尝试了使用 StringBuffer 和随机放置的解决方案,但存在位置重复的问题。另外,我尝试了 Collections.shuffle,但我并没有完全让这个工作。我还查看了线性反馈移位寄存器,但我认为这里不合适。这是一个很简单的例子,我不会对大数进行操作,所以内存分配和速度应该不会引起任何大问题。

【问题讨论】:

  • Collections.shuffle 解决方案是最直接的。向我们展示您尝试过的代码,我们可能会帮助您告诉您其中有什么问题。

标签: java arrays string algorithm random


【解决方案1】:

您可以使用 shuffle 但将其更改为 StringBuilder。除非您必须使用旧版本的 Java,否则我不会使用 StringBuffer。

public static void main(String... args) {
    StringBuilder sb = new StringBuilder("abcdefghijkl");
    for (int i = 0; i < 5; i++) {
        shuffle(sb);
        System.out.println(sb);
    }
}


public static void shuffle(StringBuilder sb) {
    Random rand = new Random();
    for (int i = sb.length() - 1; i > 1; i--) {
        int swapWith = rand.nextInt(i);
        char tmp = sb.charAt(swapWith);
        sb.setCharAt(swapWith, sb.charAt(i));
        sb.setCharAt(i, tmp);
    }
}

打印

kbljdhieagcf
gefabkhdclij
hbkfjilcgade
eacihdkjfgbl
hbjcfegdilka

【讨论】:

  • 效果很好,谢谢。更进一步,我怎么能随机选择这 n 条打印出来的行中的一条?
  • 只调用 shuffle(nb) 不在循环中?
  • 我不认为我们彼此了解(或者只是我)。这个解决方案很好,但我只是想知道我是否可以随机选择一个已经洗牌的。
  • 它们都是随机的,你怎么会选择一个而不是另一个。如果您只想要一个随机列表,请调用一次 shuffle 而不是循环。
  • 好点,它们都有相同的“随机强度”。所以我会调用一次shuffle。感谢您的帮助!
【解决方案2】:

以下使用 Collections.shuffle 的代码有效:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class Shuffle {

  public static void main(String[] args) {
    Character[] letters = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
    List<Character> shuffled = Arrays.asList(letters);
    Collections.shuffle(shuffled);
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < shuffled.size(); i++) {
      sb.append(shuffled.get(i));
    }
    System.out.println(sb);     
  }

}

【讨论】:

  • 是的,我对列表不太熟悉,但这也很好用,谢谢玛丽安 ;)
【解决方案3】:

您可以在 Java API 中查找 Random 类。这将使您能够创建随机数组索引。所以你可以从数组中随机选择字符。

【讨论】:

  • 这个问题是确保你没有任何重复。 ;)
  • @Peter:没问题,SO 有人会关心并提供完整的代码,为 Cut'n Paste 做好准备:)
【解决方案4】:
String randomize(char[] letters) {
    String newString = new String[letters.length];
    for (int i = 0; i <= letters.length; i++) {
        int randomChar = Math.floor(Math.random() * letters.length);
        newString[i] = letters[randomChar];
    }
    return newString;
}

【讨论】:

    【解决方案5】:

    我已经尝试了以下代码...我想你可以在你的场景中使用它!

    String[] alphabets = new String[12];
    int i = 0;
    char[] arrayAlpha = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'};       
    for (char ch : arrayAlpha) {
       alphabets[i++] = String.valueOf(ch);
    }
    
    List<String> list = Arrays.asList(alphabets);
    Collections.shuffle(list);
    
    for (String alpha : list) {
        System.out.print(alpha + " ");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2011-02-18
      • 2012-06-09
      • 2018-07-30
      相关资源
      最近更新 更多