繁体   English   中英

在Java中的字符串数组中随机播放特定数量的字符串

[英]Shuffle a specific number of strings in a String Array in Java

我的文本文件很长,我需要将所有长度超过4个字母的单词混排,但是其他单词需要保留在同一位置。 无需使用“收集”模块。

我可以设法对数组中的所有字符串进行混洗,但是我一生都无法弄清楚如何仅对一部分进行混洗。

public static String[] getScramble(String text) {
    Random rgen=new Random();
    String[] textArray=text.split(" ");
    for(int i=0;i<textArray.length;i++){
        int randPos=rgen.nextInt(textArray.length);
        String temp=textArray[i];

        if (textArray[i].length()>4){
            textArray[i]=textArray[randPos];
            textArray[randPos]=temp;

        }else{
            textArray[i]=textArray[i];
        }

    }

    return textArray;

谢谢!

如果两个单词都大于4个字符,则只交换两个单词,否则将它们保持在原始位置:

for(int i = 0; i < textArray.length; i++) {
    int randPos = rgen.nextInt(textArray.length);
    if (textArray[i].length() > 4 && textArray[randPos].length() > 4){
        String temp = textArray[i];
        textArray[i]=textArray[randPos];
        textArray[randPos]=temp;
    }
}

编辑:如果长字的数量与短字的数量相比很小,则此循环的行为可能不佳(因为它将无法交换大多数长字),因此您可以按以下方式进行改进:

for(int i=0;i<textArray.length;i++){
    if (textArray[i].length() > 4) {
        // find a long word to swap textArray[i] with 
        int randPos=rgen.nextInt(textArray.length);
        while (textArray[randPos].length() <= 4){
            randPos=rgen.nextInt(textArray.length);
        }
        // swap the two long words
        String temp=textArray[i];
        textArray[i]=textArray[randPos];
        textArray[randPos]=temp;
    }
}

为长度超过4个字符的单词生成随机位置时,请检查新位置是否也包含长度超过4个字符的单词。 如果没有,您将继续生成新的随机位置,直到找到合适的位置。

public static String[] getScramble(String text) {
    Random rgen = new Random();
    String[] textArray = text.split(" ");

    for (int i = 0; i < textArray.length; i++) {
        if( textArray[i].length() > 4) {
            String temp = textArray[i];

            int randPos = rgen.nextInt(textArray.length);
            while( textArray[randPos].length() <= 4 ){
                randPos = rgen.nextInt(textArray.length);
            }

            textArray[i] = textArray[randPos];
            textArray[randPos] = temp;

        }
    }

    return textArray;
}

可能出现的情况是,如果您只有一个单词超过4个字符,这意味着甚至尝试将它们随机化是没有意义的,并且可能浪费大量时间来生成随机位置而无济于事。 要对此进行优化,您可以首先检查您的长词是否少于2个,如果是,则无需执行任何操作。

    int longWordCount = 0;
    for (int i = 0; i < textArray.length; i++) {
        if( textArray[i].length() > 4 )
            longWordCount++;

        if( longWordCount == 2 )
            break;
    }

    if( longWordCount > 1 ) {
        for (int i = 0; i < textArray.length; i++) {
            if (textArray[i].length() > 4) {
                String temp = textArray[i];

                int randPos = rgen.nextInt(textArray.length);
                while (textArray[randPos].length() <= 4) {
                    randPos = rgen.nextInt(textArray.length);
                }

                textArray[i] = textArray[randPos];
                textArray[randPos] = temp;

            }
        }            
    }

这是适应Durstenfeld算法的版本。 注意ThreadLocalRandomRandom更可取。

public static String[] getScramble(String text) {
    ThreadLocalRandom rgen = ThreadLocalRandom.current();
    String[] textArray = text.split(" ");
    int[] indices = IntStream.range(0, textArray.length)
        .filter(i -> textArray[i].length() > 4)
        .toArray();
    for (int i = indices.length; i > 1; --i) {
        int j = indices[rgen.nextInt(i)];
        int k = indices[i - 1];
        if (j != k) {
            String tmp = textArray[j];
            textArray[j] = textArray[k];
            textArray[k] = tmp;
        }
    }
    return textArray;
}

OP没有说不能使用Streams,而只是说Collections。 如果存在问题,可以用一个简单的循环替换indices的初始化,以初始化一个与textArray大小相同的int数组,使用变量i跟踪输入的索引数(因此将对其进行声明和初始化)在主要for循环之前)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM