我的文本文件很长,我需要将所有长于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;
谢谢!
答案 0 :(得分:0)
如果两个单词都大于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;
}
}
编辑:如果长字的数量与短字的数量相比很小,则此循环的行为可能不佳(因为它将无法交换大多数长字),因此您可以按以下方式进行改进:< / p>
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;
}
}
答案 1 :(得分:0)
为长度超过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;
}
}
}
答案 2 :(得分:0)
这是适应Durstenfeld's algorithm的版本。请注意,ThreadLocalRandom
比Random
更好。
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
的初始化,以使用变量int
来初始化与textArray
大小相同的i
数组跟踪输入的索引数(因此将在主for
循环之前对其进行声明和初始化)。