Есть задание сделать анаграмму ,например lashjkuj2 akcc66. Чтобы все не буквенные символы остались на месте? Я сделал так. Но ошибка в том, что я проверяю не все символы? Нужно все.
package com.foxminded.Task;
public class WordsAndNumbers {
//создаем массив, который содержит символы и цифры
private final static char[] SYMBOLS_AND_DIGITS = {'1', '!'};
private static StringBuilder result = new StringBuilder();
public static void main(String[] args) {
String inputString = "a1бвгд ежз!и";
//разделяем строку по словам
String[] words = inputString.split(" ");
for(int i = 0; i < words.length; i++) {
//проходим по каждому слову и результат добавляем в стрингБилдер
String resultWord = reverseWord(words[i], getPositionsToChange(words[i], getCountOfLetters(words[i])));
result.append(resultWord).append(" ");
}
//выводим результат
System.out.println(result.toString());
}
//метод для проверки яаляется текущий элемент буквой или символом
public static boolean isSymbolOrDigit(char element) {
for(int i = 0; i < SYMBOLS_AND_DIGITS.length; i++) {
//если текущий элемент равен массиву из символов и цифр, то возвращаем тру, говоря что это символ или цифра
if (SYMBOLS_AND_DIGITS[i] == element) {
return true;
}
}
return false;
}
/*
на вход получаем само слово и позиции букв, которые нам и нужно переставлять
перебираем все элементы массива
алгоритм такой:
определяем индекс начала и конца массива позиций,
получаем значение букв в слове по позиции, что записаны у нас в массиве и меняем букву по
позиции первого элемента в массиве позиций с последней позицией
и так проходим по каждой букве, так как позиции символов или цифр мы не добавяли в массив позиций,
то мы их не меняем и они остаются на том же месте
цикл останавливается, когда текущий индекс i будет равен половины длины, потому что мы как бы идем
с двух сторон(начало и конец) и дойдя до середины гарантируем, что все элементы поменяны местами
*/
public static String reverseWord(String word, int[] letterPositions) {
char[] chArray = word.toCharArray();
for(int start = 0, end = letterPositions.length-1; start <= end; start++, end--) {
char c = chArray[letterPositions[start]];
chArray[letterPositions[start]] = chArray[letterPositions[end]];
chArray[letterPositions[end]] = c;
}
return new String(chArray);
}
//считаем количество букв для того, чтоб потом создать массив с позициями букв и проинициализировать его
public static int getCountOfLetters(String word) {
int count = 0;
for(int i = 0; i < word.length(); i++) {
//проверяем является ли текущий элемент строки символом или цифрой
if(isSymbolOrDigit(word.charAt(i))) {
//если попали сюда - значит, что элемент цифра или буква и считать их количество нам не нужно,
// по этому переходим к следующей итерации без изменений
continue;
}
//если мы здесь, значит работаем с буквой и увеличиваем значение
count++;
}
return count;
}
//запоминаем позиции букв
public static int[] getPositionsToChange(String word, int lettersCount) {
int[] positions = new int[lettersCount];
for(int i = 0, j = 0; i < word.length() && j < positions.length; i++) {
//проверяем является ли текущий элемент строки символом или цифрой
if(Character.isLetterOrDigit(word.charAt(i))) {//Character.isLetter
continue;
}
//записываем в наш массив позиций позиции букв
positions[j] = i;
j++;
}
return positions;
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите, пожалуйста, способ нахождения самой длинной строки в ArrayList
Запустил приложение все работало ,обнавил страницу выдал ошибку перезапустил снов одно и тожеЧто это с чем связано ребята??помогите при...
Использую Retrofit2 для отправки файлов на сервер, POST запрос принимает два параметра file и shared-with, использую такой код: