Генерация слова и смешение букв в нем (Java)

90
09 марта 2022, 00:00

Друзья, встал в жесткий тупик. Не понимаю - я где-то туплю или чего-то не понимаю. Нужно создать два массива (можно списка, суть не меняется, пробовал)

Первый: со случайно выбранным словом Второй: с этим же словом, но в котором все буквы перемешанны (изменен порядок)

По отдельности все удается и даже если засунуть это в один метод работает, но нужно именно два отдельных массива.

В чем проблема. RandomWord получает значение случайного слова разбитого по буквам. Когда запускаем ShuffleMachine(); то RandomWord тоже изменяет порядок букв. Я не могу понять в чем дело.

    public class TestBase {
    private String[] Generateword(){
        String[] wordList = {"яблоко","бардак","грабли"};
        int oneLength = wordList.length;
        int rand1 = (int) (Math.random() * oneLength);
            String RandomWord = wordList[rand1];
                String[] RWordom = RandomWord.split("");//разбив по буквам
                    return RWordom;
    }// генерим случайное слово массива
    private String[] RandomWord = Generateword(); //присвоили массиву сгенерированне слово
    private String[] ShuffleMachine(){
        String[] Literals =  RandomWord;
            List<String> shuffle = Arrays.asList(Literals);
            Collections.shuffle(shuffle);
            shuffle.toArray(Literals);
                return Literals;
    } // перемешать буквы в слове
    private String[] ShuffleWord = ShuffleMachine();// присваиваем уже смешенное слово
    public void shows(){
        System.out.println("Слово" + Arrays.toString(RandomWord));
        System.out.println("Перемешанное" + Arrays.toString(ShuffleWord));
        ShuffleMachine();
    }
}
Answer 1

Проблема в строке:

String[] Literals =  RandomWord;

Тут ты не создаешь новый массив Literals, аналогичный RandomWord, а создаешь переменную, ссылающуюся на тот же самый объект. По сути после этой строчки у тебя остался один объект массива, на которой указывают две ссылки. Самый легкий способ поправить программу, так сказать, в лоб, это присвоить переменной Literals копию массива RandomWord:

String[] Literals = Arrays.copyOf(RandomWord, RandomWord.length);
Answer 2

все проще, достаточно добиться того, чтобы ваш массив копировался в методе, который перемешивает буквы. это можно сделать стандартным копированием, а можно через стрим, ведь стрим иначе и не умеет))

import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;
public class TestBase {
    // генерим случайное слово массива
    private static String[] generateword(final String[] wordList) {
        return wordList[(int) (Math.random()*wordList.length)].split("");
    }
    // перемешать буквы в слове
    private static String[] shuffleMachine(final String[] randomWord) {
        return Arrays.stream(randomWord)
                .sorted((o1, o2) -> ThreadLocalRandom.current().nextInt(-1, 2))
                .toArray(String[]::new);
    } 
    public static void main(String[] args) {
        String[] wordList = {"яблоко", "бардак", "грабли"};
        String[] generateword = generateword(wordList);
        String[] shuffle = shuffleMachine(generateword);
        System.out.println("Слово" + Arrays.toString(generateword));
        System.out.println("Перемешанное" + Arrays.toString(shuffle));
    }
}
Answer 3

Правильно не использовать переменную класса внутри метода, а передавать ее значение в качестве параметра

private String[] ShuffleMachine(String[] word){
        String[] Literals =  word;
        List<String> shuffle = Arrays.asList(Literals);
        Collections.shuffle(shuffle);
        shuffle.toArray(Literals);
        return Literals;
    } // перемешать буквы в слове
private String[] ShuffleWord = ShuffleMachine(RandomWord);
READ ALSO
Локальный минимум в списке

Локальный минимум в списке

Задача заключается в следующем:

86
Зачем создавать интерфейсы для классов с единственной реализацией

Зачем создавать интерфейсы для классов с единственной реализацией

С таким я столкнулся еще когда впервые узнал про DAO-слой, где один парень настойчиво рекомендовал не делать конкретную реализацию, а программировать...

82
Странный вывод в txt файл. (вывод RGB данных пикселей картинок в txt файл)

Странный вывод в txt файл. (вывод RGB данных пикселей картинок в txt файл)

Попробовал найти и вывести RGB данные одной картинки (ну конечно программа должна работать для любых картинок) в один соответствующий txt файл

89
Распарсить массив json в составе json

Распарсить массив json в составе json

Имею массив json в составе большого jsonИспользую jackson

91