在加扰字符串时防止重复的字母?

时间:2014-05-15 18:11:56

标签: java string

我正在创建一个程序,它将输出一个字符串的字母,但是已经乱码了。它有效,但没有办法阻止一封信出现多次。我该怎么做呢?

我的代码:

import java.util.Random;


public class Final {

    public static void main(String[] args) {
        Random rand = new Random();
        String str = "pumpkinpie";

        String[] split = str.split("");
        for(int i = 0; i < split.length; i++){
            int randomLet = rand.nextInt(split.length);
            System.out.print(split[randomLet]);
        }

    }

}

4 个答案:

答案 0 :(得分:5)

您可以将String中的每个字符添加到ArrayList中,并使用Collections.shuffle()方法对其进行随机播放,该方法也接受Random实例:

    //1. initiate the string you want to shuffle
    String originalString = "pumkinpie";
    //2. initiate a List into which the characters will be added
    List<Character> characterList= new ArrayList<Character>();
    //3. add each character from the String to the List
    for (char character : originalString.toCharArray()) {
        characterList.add(character);
    };
    //4. shuffle using Collections.shuffle
    Collections.shuffle(characterList, new Random());
    //5. print each character
    for (Character character : characterList) {
        System.out.println(character);
    }

答案 1 :(得分:0)

将字母添加到数组/ Set / List,仅在数组/ Set / List不包含字母时打印:

Set<String>...
for(int i = 0; i < split.length; i++){
    int randomLet = rand.nextInt(split.length);
    if(set does not contain split[randomLet]){
        System.out.print(split[randomLet]);
        add split[randomLet] to set
    }
}

答案 2 :(得分:0)

主要是概念性答案

如果您正在尝试随机化字符串,那么请认识到,放置字母不能重复的逻辑过滤器实际上会降低熵,从而出于任何目的降低安全性或基本随机性。此外,这将非常困难,因为如果检测到重复,则需要重新加扰。

以例如:

randomize "add" - characters as 123
a   - 1
ad  - 13
add - 132
! back to drawing block

作为一个人,我们知道只有一个非重复的字符串可以来自爸爸(字符顺序为312和213),但是系统会点击每个选项,直到它击中其中一个,每次都开始...

add > add > dad > dad > dda > dda 
123 > 132 > 213 > 312 > 321 > 231 

或像sorry这样的字: 有120种排列,其中有8种不同的方式,其中第3和第4个字母以rr34方式(2种方式和4种位置)重复(43)结果字符串)。在120种可能性中,这占了48种排列,其中许多排列直到许多字符才被发现。

在具有更多重复字符的单词中(例如comodo,具有6个不同的o双精度数,这涵盖了可能720的576种排列),您会遇到脚本变得非常低效的情况由于挣扎......

但是,如果你需要这个,你最好的选择是编写一个随机化一个单词的函数,检查,然后再次随机化。手工操作(一次一个字符)对于更容易的单词来说会慢一些,而且对于麻烦的单词,你将获得与其他任何东西一样多的运气。让幸运女神引导你......

答案 3 :(得分:0)

如果OP只想加扰而不想删除任何字符。

换句话说,pmieupnpki是有效的输出

之一

然后,

而不是盲目地随机交换该数组中的元素。因为小范围内的随机可能是相同的。

Random rand = new Random();
        String str = "pumpkinpie";

        char[] split = str.toCharArray();
        for(int i = 0; i < str.length(); i++){
            int randomLet = rand.nextInt(split.length);
            char c = split[randomLet];
            split[randomLet] =  split[i];
            split[i] = c;
        }
        System.out.println(String.valueOf(split));