有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java随机生成唯一字符数组。我想知道为什么我原来的方法现在做得更好了

我应该生成一个随机排列的字母表。我知道一些洗牌方法和类似Fisher-Yates洗牌算法的东西,但我最初尝试的方法永远不会奏效。我有一个按规则顺序排列的字母表“参考”数组。然后每26个空间就有一个for循环。我将生成一个0到25之间的随机整数(用于引用数组中的索引)。然后,我将检查数组中是否已经有该字符(它必须是唯一的)。如果它是唯一的,我将其添加到数组中。但它仍然有重复的。这是我的密码:

public static final char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                                      'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v',
                                      'w', 'x', 'y', 'z', ' '};
public static char[]    cipherGenerator(){
    char[] cipherAlpha = new char[26];
    for(int index = 0; index < 26; index++){

        Random rand = new Random();
        int newLetter = rand.nextInt(25);
        char newChar = ALPHABET[newLetter];

        while(Arrays.asList(cipherAlpha).contains(newChar)){
            newLetter = rand.nextInt(25);
            newChar = ALPHABET[newLetter];
        }
        cipherAlpha[index] = newChar;

    }
    return cipherAlpha;
}

这将返回带有重复项的代码,尽管我尽了一切努力试图找到逻辑错误。提前感谢您的帮助


共 (3) 个答案

  1. # 1 楼答案

    当您将char[]之类的基元数组传递给Arrays.asList时,该方法无法返回List<char>,因为基元类型不允许作为类型参数。但是它可以而且确实产生一种List<char[]>。您的随机char永远不等于List中的单个char[],因此允许任何重复的char。如果对cipherAlpha使用Character[]而不是char[],并将方法的返回类型更改为Character[],那么Arrays.asList将正确推断类型参数Character,从而允许重复检查正常工作

    其次,nextInt(25)将在024之间生成一个随机索引,而不是25。您可以使用ALPHABET.length,这里是26。有了第一个变化,但没有这个变化,你将只有25个不同的字符,你永远不会找到第26个不同的字符,永远循环

  2. # 2 楼答案

    在ArrayList中添加字母表,并在每次轮换时删除选定的元素。然后更新你的rand。nextInt-like:

    rand.nextInt(AlphabetList.size());
    

    你的字母表是:

    List<char> AlphabetList = Arrays.asList('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j','k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v','w', 'x', 'y', 'z', ' ');
    
  3. # 3 楼答案

    默认情况下,生成的随机数是重复的,为了克服这一问题,您可以继续向集合集中添加数字,直到获得所有唯一的数字

        while(set.size()< 26) {
            while (set.add(random.nextInt(26)) != true);
        }
    

    另一种方法是将所有整数添加到列表&;然后洗牌

    for (int i=0; i<26; i++) {
            numberList.add(new Integer(i));
    }
    Collections.shuffle(list);
    

    如果您愿意,可以直接对角色进行洗牌

    List<Character> characters = Arrays.asList('a', 'b', 'c', 'd');
    Collections.shuffle(characters);