Друзья, встал в жесткий тупик. Не понимаю - я где-то туплю или чего-то не понимаю. Нужно создать два массива (можно списка, суть не меняется, пробовал)
Первый: со случайно выбранным словом Второй: с этим же словом, но в котором все буквы перемешанны (изменен порядок)
По отдельности все удается и даже если засунуть это в один метод работает, но нужно именно два отдельных массива.
В чем проблема. 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();
}
}
Проблема в строке:
String[] Literals = RandomWord;
Тут ты не создаешь новый массив Literals
, аналогичный RandomWord
, а создаешь переменную, ссылающуюся на тот же самый объект. По сути после этой строчки у тебя остался один объект массива, на которой указывают две ссылки.
Самый легкий способ поправить программу, так сказать, в лоб, это присвоить переменной Literals
копию массива RandomWord
:
String[] Literals = Arrays.copyOf(RandomWord, RandomWord.length);
все проще, достаточно добиться того, чтобы ваш массив копировался в методе, который перемешивает буквы. это можно сделать стандартным копированием, а можно через стрим, ведь стрим иначе и не умеет))
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));
}
}
Правильно не использовать переменную класса внутри метода, а передавать ее значение в качестве параметра
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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
С таким я столкнулся еще когда впервые узнал про DAO-слой, где один парень настойчиво рекомендовал не делать конкретную реализацию, а программировать...
Попробовал найти и вывести RGB данные одной картинки (ну конечно программа должна работать для любых картинок) в один соответствующий txt файл