Переверните строку только для алфавитов в предложении, а не цифр или специальных символов в Java - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу реализовать метод, возвращающий строку после обращения только алфавитов [a-zA-Z] в предложении, а не числа или специальных символов.Реверс должен быть сделан дословно.Например: для 25000rs for 1 LCD это должно быть 25000sr rof 1 DCL.

public class Main {
    static String reverseWords(String inputString) { 
    String[] words = inputString.split(" ");

    String reverseString = "";

    for (int i = 0; i < words.length; i++) 
    {
        String word = words[i];

        String reverseWord = "";

        for (int j = word.length()-1; j >= 0; j--) 
        {
            reverseWord = reverseWord + word.charAt(j);
        }

        reverseString = reverseString + reverseWord + " ";
    }
    return reverseString;
}
public static void main(String[] args)
{
    String str1 = "1 cup of hot coffee costs 8.00, whereas cold coffee costs 45.00."; 
    System.out.println(reverseWords(str1));  

    String str2 = "It Costs 25000rs for 1 LCD Projector."; 
    System.out.println(reverseWords(str2)); 

    String str3 = "8990.33"; 
    System.out.println(reverseWords(str3)); 
}
}  

Это вывод, который я хочу:

1 puc fo toe eeffoc stsoc 8.00, saerehw dloc eeffoc stsoc45.00.

tI stsoC 25000sr rof 1 DCL rotcejorP.

8990.33

Это вывод, который я получаю:

1PuC To To Eeffoc Stsoc, 00,8 saerehw Dloc Eeffoc Stsoc .00,54

TI STSOC Sr00052 rof 1 DCL .rotcejorP

33.0998

1 Ответ

2 голосов
/ 18 апреля 2019

Вы просто разделяете пробелы, что делает каждую последовательность непробельных символов «словом».

Это задание является каноническим вариантом использования регулярного выражения MatcherappendReplacement / appendTail цикл, который вы всегда можете использовать, когда предполагаемая логика замены слишком сложна для простого replaceAll(String regex, String replacement) на String:

static final Pattern WORD = Pattern.compile("\\pL+"); // class "L" means "letter"

static String reverseWords(String inputString) { 
    Matcher m = WORD.matcher(inputString);
    if(!m.find()) return inputString;
    StringBuffer sb = new StringBuffer(inputString.length());
    do {
        m.appendReplacement(sb, new StringBuilder(m.group()).reverse().toString());
    } while(m.find());
    return m.appendTail(sb).toString();
}

(Начиная с Java 9, этот API также поддерживает использование StringBuilder вместо StringBuffer.


Но в этом конкретном случае эту операцию также можно сделать несколько более эффективной:

static String reverseWords(String inputString) { 
    Matcher m = WORD.matcher(inputString);
    if(!m.find()) return inputString;
    StringBuilder sb = new StringBuilder(inputString);
    do {
        for(int ix1 = m.start(), ix2 = m.end() - 1; ix1 < ix2; ix1++, ix2--) {
            sb.setCharAt(ix1, inputString.charAt(ix2));
            sb.setCharAt(ix2, inputString.charAt(ix1));
        }
    } while(m.find());
    return sb.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...