微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java中的反向文本

如何解决Java中的反向文本

我需要帮助。 我只需要反转文本中的拉丁符号,所有其他符号应留在同一位置。 但是结果还有一些其他的“”。我认为这是因为我在String builder中使用了setLength,但是我不知道如何解决它。

其工作方式示例:

输入:[href*="#"]

输出Sra1katr#/ g1gl,pl2

这是我的代码

rta1karS#/ l1gg,lp2

解决方法

此行是错误的根源:

invertedSentece = invertedSentece.append(invertedWord).append(" ");

您在每个词后添加" "。您根本无法在最后一个单词之后添加它:)

实现这一目标的古老技巧是在单词循环之前引入变量boolean first = true;,并在单词循环结束时说fitrst = false;,然后在单词循环的开头插入“”,像这样:

boolean first = true;
for (String word : words) {
    if (!first) {
        invertedSentece = invertedSentece.append(" ");
    }
    ...
    invertedSentece = invertedSentece.append(invertedWord);
    first = false;
}

此外,使用字母列表非常低效。通常,答案显然是Set而不是List,但是在这种情况下,您可以简单地编写一个静态方法

private static boolean isInLatinAlphabet(char c) {
    return
        (c >= 'A' and c <= 'Z') ||
        (c >= 'a' and c <= 'z');
}

之所以可行,是因为char是数字类型,并且Java使用UTF-16作为char,Character和String的内部表示形式。

因此,就像ASCII中一样,与EBCDIC中不同,A-Z,a-z和0-9形式的序列。

,

请尝试使用此代码,最后参考说明:

输入:afsg%gag thy @ sdg $

输出:gagg%sfa gds @ yht $

代码:

public static void main(String[] args) {
    System.out.println("Enter text for reverse");

    Scanner scan = new Scanner(System.in);
    String text = scan.nextLine();

    String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    char[] alphabetArray = alphabet.toCharArray();
    List<Character> alphabetList = new ArrayList<Character>();
    for (char c : alphabetArray) {
        alphabetList.add(c);
    }

    String[] words = text.split(" ");
    StringBuilder invertedSentece = new StringBuilder(); // We don't need "" to initialize a stringbuilder

    for (String word : words) {
        StringBuilder invertedWord = new StringBuilder(); // We don't need "" to initialize a stringbuilder//           invertedWord.setLength(word.length()); 
        int deleteIndex = 1; // Use an index and increase the counter everytime we find a latin letter
        HashMap<Integer,Character> storeLatin = new HashMap<>(); // Creating a hashmap to store latin letters in a
                                                                    // word

        for (int i = word.length() - 1; i >= 0; i--) {
            if (alphabetList.contains(word.charAt(i))) {
                int c = word.length() - deleteIndex - i;
                invertedWord = invertedWord.insert(c,word.charAt(i));
            } else {
                storeLatin.put(Integer.valueOf(i),Character.valueOf(word.charAt(i)));
                deleteIndex++;
            }
        }

        // Loop to read letters from hashmap and add them at the specified index
        for (Map.Entry<Integer,Character> item : storeLatin.entrySet()) {
            invertedWord.insert(item.getKey().intValue(),item.getValue());
        }

        invertedSentece = invertedSentece.append(invertedWord).append(" ");
    }
    System.out.println(invertedSentece.substring(0,invertedSentece.length() - 1));
}

说明:

else语句逻辑有问题。

让我们以abe#hy为例,同时反转我们移动的字符串

y在0索引处 h在1索引 现在我们在索引3处分配#,当前的反向单词为“ yh#”

在下一次迭代中,当我们将另一个字母e推入stringbuilder时,它将继续将所有内容推向右侧-“ yhe#”

第二点是在StringBuilder的索引处删除一个字符,然后在所有索引处添加项目,但此索引仍将在我们的结果中保留空白。为避免此问题,我们需要维护一个包含拉丁字母数量的计数器,并使用它来计算其他索引(请参阅deleteIndex变量的使用)。

,
public static String reverseOnlyLetters(String str) {
    StringBuilder buf = new StringBuilder(str.length());

    for (int i = 0,j = str.length() - 1; i < str.length(); ) {
        if (j >= 0) {
            if (Character.isLetter(str.charAt(j))) {
                if (Character.isLetter(str.charAt(i))) {
                    buf.append(str.charAt(j--));
                    i++;
                } else
                    buf.append(str.charAt(i++));
            } else
                j--;
        } else
            buf.append(str.charAt(i++));
    }

    return buf.toString();
}

输出:

System.out.println(reverseOnlyLetters("a_bc_DEF_ghij"));        // j_ih_gFE_Dcba
System.out.println(reverseOnlyLetters("!@#$%^&*()_+"));         // !@#$%^&*()_+
System.out.println(reverseOnlyLetters("afsg%gag thy@sdg$"));    // gdsy%htg agg@sfa$
,

我是怎么做到的:

String revers(String inputText) {
    
    List<String> words = new ArrayList<String> (Arrays.asList(inputText.split(" ")));
    StringBuilder invertedSentence = new StringBuilder();

    for (String word : words){
        Map<Integer,Character> storeLetter = new HashMap<Integer,Character>();
        int deleteIndex = 1;
        StringBuilder invertedWord = new StringBuilder();
        for (int i = word.length() - 1; i >= 0; i--)
            if (Character.isLetter(word.charAt(i))) {                   
            
                int c = word.length() - deleteIndex - i;
                invertedWord = invertedWord.insert(c,word.charAt(i));
                    
    }
            else {
                storeLetter.put(i,word.charAt(i));
                deleteIndex++;
                        }  

    for (Map.Entry<Integer,Character> letter : storeLetter.entrySet()) {
        invertedWord.insert(letter.getKey().intValue(),letter.getValue());         
    }
    invertedSentence.append(invertedWord);
    invertedSentence.append(" ");
    }
    return invertedSentence.toString().trim();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。