在 Java 中打乱字符串

Shuffling strings in Java

当我创建 Java 字符串洗牌器时,我遇到了一个问题: 程序卡在某处。

  1. 我必须通过 BufferedReader 传递一个句子或一个词
  2. 我必须打乱 word/sentence 以便第一个元素是第一个字母,然后是最后一个字母,然后是第二个字母,然后是倒数第二个,直到作业完成

    2.1。如果 word/sentence 长度为奇数,则中间字符必须放在 word/sentence.

  3. 的末尾
  4. 必须打印出来 结果应该是这样的:

我的代码;

public static void main(String[] args) {
    String enteredValue = null;
    int charArrayLength = 0;

    System.out.println("Dāvis Naglis IRDBD11 151RDB286");
    System.out.println("input string:");
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        enteredValue = br.readLine();

        charArrayLength = enteredValue.length(); // length of array entered
        char[] characters = new char[charArrayLength];
        characters = enteredValue.toCharArray();

    } catch (Exception e) {
        e.printStackTrace();
    }

    char[] tempChars = new char[charArrayLength];
    for (int i = 0; i <= charArrayLength - 1; i++) {
        tempChars[i] = enteredValue.charAt(i);
    }
}

/**
 * Shuffles the char array if it's length is even
 *
 * @param array
 */
public static void shuffle(char[] array) {
    char[] tempChars = null;
    for (int j = 0; j <= array.length; j++) {
        if ((array.length % 2 == 0) && (j < array.length)) { // array[j] == (array.length / 2) + 1
            tempChars[j] = array[array.length - j];
        } else if (array.length % 2 != 0) {
            tempChars[array.length] = array[j];
        } // end else if
    } // end for

    String shuffledSentence = new String(tempChars);
    System.out.println(shuffledSentence);
}

不要看多行注释,从一开始就没改过。

提前致谢!

哇。你的算法对于这个问题来说太复杂了! 试试这个洗牌:

int n = array.length;
char[] resChars = new char[n];
boolean flag = false;

if (n % 2 != 0) {
    flag = true;    
    char tmp = array[n / 2];
}

for (int j = 0; j < n - 1; j += 2) {
    resChars[j] = array[j / 2];
    resChars[j + 1] = array[n - 1 - (j / 2)]
} 

if (flag)
    resChars[n - 1] = tmp;

您可以尝试这样的操作:

String str;
char[] chars = str.toCharArray();
List<Character> list = new ArrayList<>();
for (char aChar : chars) {
    list.add(aChar);
}
Collections.shuffle(list);
String result = list.toString().replaceAll("[\[\],]", "");

洗牌变得简单:

int len = array.length;
char[] tempArray = new char[len];
int i=0, j=0, k=len-1;

while (i<len) {
   tempArray[i++] = array[j++];
   if (i<len) {
     tempArray[i++] = array[k--];
   }
}

你的程序没有卡住,它正常退出。

Process finished with exit code 0

该过程没有更多工作要做,因为您没有调用 您的静态随机播放方法。

此外,正如其他人已经回答的那样,您的静态随机播放方法需要一些设计 重构。