Jumble String - метод Java - PullRequest
4 голосов
/ 29 мая 2011

Я новичок в 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 ]

4 голосов
/ 29 мая 2011

Вы, вероятно, просто хотите использовать для этого Фишер-Йейтса shuffle . Для этого требуется всего один проход, и он должен произвести "честное" перемешивание (при условии, что в вашем генераторе случайных чисел достаточно битов энтропии).

1 голос
/ 29 мая 2011

Ваш код выглядит хорошо для меня. Главное, что я бы сделал, было бы запустить индекс цикла for с 0, внутри него использовать цикл do / while и не делать никаких рандомизаций и присваиваний перед циклом for, а делать все это из цикла for:

  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, который может запускаться или не выполняться в зависимости от условий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...