【问题标题】:Shuffling strings in JavaJava中的混洗字符串
【发布时间】:2016-03-01 08:43:02
【问题描述】:

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

  1. 我必须通过 BufferedReader 传递一个句子或一个单词
  2. 我必须对单词/句子进行洗牌,以便第一个元素是第一个字母,然后是最后一个字母,然后是第二个字母,然后是从末尾开始的第二个直到工作完成

    2.1。如果单词/句子长度为奇数,则中间字符必须放在单词/句子的末尾。

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

我的代码;

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);
}

不要看多行cmets,从一开始就没有改过。

提前致谢!

【问题讨论】:

  • 请在问题中包含代码,而不是提供指向它的链接。
  • 一定要用char数组吗?
  • shuffle 永远不会被调用,如果你调用它,它会立即崩溃并出现空指针异常,因为tempChars(在shuffle 内)从未被初始化。
  • 如果您的算法卡住了,请在调试器中运行代码并暂停它,这将向您显示卡在哪里,如果然后单步执行代码,您将了解原因。
  • @ammoQ 看到..做了很多版本的代码。这是我在利用 StackOverFlow 之前的最后一次尝试,似乎我已经忘记了......我会做出这些改变,然后我会提交一个答案!

标签: java string shuffle


【解决方案1】:

洗牌变得容易:

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--];
   }
}

【讨论】:

  • 谢谢您,先生!像魅力一样工作!
【解决方案2】:

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

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;

【讨论】:

    【解决方案3】:

    你可以试试这样的:

    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("[\\[\\],]", "");
    

    【讨论】:

    • 稍后我会尝试所有这些变体!谢谢;会带回答案!
    • 不,这没有得到问题中提出的模式。只是随机化数组并去掉逗号
    【解决方案4】:

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

    进程以退出代码 0 结束

    这个过程没有更多的工作要做,因为你不打电话 你的静态随机播放方法。

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

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 2013-12-22
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      相关资源
      最近更新 更多