Помогите сократить программу. java

541
04 января 2017, 02:00

Есть задание сделать анаграмму ,например 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;
    }
}
READ ALSO
Как найти самую длинную строку в List?

Как найти самую длинную строку в List?

Подскажите, пожалуйста, способ нахождения самой длинной строки в ArrayList

773
roll back error

roll back error

Запустил приложение все работало ,обнавил страницу выдал ошибку перезапустил снов одно и тожеЧто это с чем связано ребята??помогите при...

569
В чём различие между jdk, sdk и j2sdk?

В чём различие между jdk, sdk и j2sdk?

В чём заключается различие между JDK, SDK и J2SDK?

587
Ошибка в Retrofit2: Only one encoding annotation is allowed

Ошибка в Retrofit2: Only one encoding annotation is allowed

Использую Retrofit2 для отправки файлов на сервер, POST запрос принимает два параметра file и shared-with, использую такой код:

620