在 Java 中打乱字符串
Shuffling strings in Java
当我创建 Java 字符串洗牌器时,我遇到了一个问题:
程序卡在某处。
- 我必须通过 BufferedReader 传递一个句子或一个词
我必须打乱 word/sentence 以便第一个元素是第一个字母,然后是最后一个字母,然后是第二个字母,然后是倒数第二个,直到作业完成
2.1。如果 word/sentence 长度为奇数,则中间字符必须放在 word/sentence.
的末尾
必须打印出来
结果应该是这样的:
我的代码;
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
该过程没有更多工作要做,因为您没有调用
您的静态随机播放方法。
此外,正如其他人已经回答的那样,您的静态随机播放方法需要一些设计
重构。
当我创建 Java 字符串洗牌器时,我遇到了一个问题: 程序卡在某处。
- 我必须通过 BufferedReader 传递一个句子或一个词
我必须打乱 word/sentence 以便第一个元素是第一个字母,然后是最后一个字母,然后是第二个字母,然后是倒数第二个,直到作业完成
2.1。如果 word/sentence 长度为奇数,则中间字符必须放在 word/sentence.
的末尾
必须打印出来 结果应该是这样的:
我的代码;
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
该过程没有更多工作要做,因为您没有调用 您的静态随机播放方法。
此外,正如其他人已经回答的那样,您的静态随机播放方法需要一些设计 重构。