Jumble String - Java方法

时间:2011-05-29 18:58:33

标签: java string

我是Java的初学者,正在做一本书的练习。任务是编写一个静态方法,该方法将字符串数组作为参数,并以随机顺序返回字符串的混乱版本。要创建随机数,您必须使用以下内容:

import java.util.Random;
Random r = new Random();
int rand = r.nextInt();

我的回答如下:

private static String[] jumble(String[] arr){
    String [] jumbled = new String[arr.length];
    int [] chosen = new int [arr.length];
    Random r = new Random();
    int rand = r.nextInt(arr.length);
    chosen[0] = rand;
    jumbled[0] = arr[rand];
    for(int i = 1; i < arr.length; i++){
        while(checkIfChosen(chosen, rand, i)){
            rand = r.nextInt(arr.length);
        }
        chosen[i] = rand;
        jumbled[i] = arr[rand];
    }
    print(jumbled);
    return jumbled;
}


private static void print(String[]arr){
    for(int i = 0; i < arr.length; i++){
        System.out.println(arr[i]);
    }
}

private static boolean checkIfChosen(int[] arr, int a, int ind){
    for(int i = 0; i < ind; i++){
        if(arr[i]==a){
            return true;
        }
    }
    return false;
}

这确实有效,但似乎很长时间以来这么简单。任何人都可以改进吗?有没有更简单的方法来实现这样的任务,坚持问题中提到的约束?

编辑:随着费雪耶茨洗牌:

public static void main(String[] args) {
    String [] original = {"Hello", "How", "Are", "You"};
    jumble(original);
}


private static String[] jumble(String[] arr){
    Random r = new Random();
    for(int i = arr.length-1; i > 0; i--){
        int rand = r.nextInt(i);
        String temp = arr[i];
        arr[i] = arr[rand];
        arr[rand] = temp;
    }
    print(arr);
    return arr;
}


private static void print(String[]arr){
    for(int i = 0; i < arr.length; i++){
        System.out.println(arr[i]);
    }
}

一段很棒的代码,比我的答案更有效率。感谢。

2 个答案:

答案 0 :(得分:4)

您可能只想使用Fisher-Yates shuffle。它只需要一次通过就可以产生“公平”的混乱(假设你的随机数发生器有足够的熵)。

答案 1 :(得分:1)

您的代码对我来说很好。我要做的主要事情是将for循环索引设置为0,内部使用do / while循环,并且在for循环之前不进行随机化和赋值,而是在for循环中执行所有这些操作: / p>

  Random r = new Random();
  int rand = 0;
  for (int i = 0; i < arr.length; i++) {
     do {
        rand = r.nextInt(arr.length);
     } while (checkIfChosen(chosen, rand, i));
     chosen[i] = rand;
     jumbled[i] = arr[rand];
  }

do / while循环保证至少运行一次,而while循环可能会或可能不会运行,具体取决于条件。