有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的stringbuilder反向文本

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

它应该如何工作的示例:

输入:Sra1katr#/ g1gl, pl2

输出:rta1karS#/ l1gg, lp2

这是我的代码:

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("");
            
    for (String word : words) {
        StringBuilder invertedWord = new StringBuilder("");
        invertedWord.setLength(word.length());
                
        for (int i = word.length() - 1; i >= 0; i--) {
            if (alphabetList.contains(word.charAt(i))) {
                int c = word.length() - 1 - i;
                invertedWord = invertedWord.insert(c, word.charAt(i));
            } else {
                invertedWord = invertedWord.deleteCharAt(i);
                invertedWord = invertedWord.insert(i, word.charAt(i));
            }
        }
        invertedSentece = invertedSentece.append(invertedWord).append(" ");
    }
    System.out.println(invertedSentece);
}

共 (4) 个答案

  1. # 1 楼答案

    我是如何做到的:

    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();
    }
    
  2. # 2 楼答案

    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$
    
  3. # 3 楼答案

    试试这段代码,它能工作,请参阅最后的解释:

    输入:afsg%gagthy@sdg美元

    输出:gagg%sfagds@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为例,在反转移动的字符串时

    索引为0时为y h在1个索引处 现在我们将#分配到索引3,当前的反相器DWORD是“yh#”

    在下一次迭代中,当我们将另一个字母e推到stringbuilder中时,它只会将所有内容推到右边——“yhe#”

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

  4. # 4 楼答案

    这一行是错误的来源:

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

    在每个单词后面加上" "。您不能简单地将其添加到最后一个单词后面:)

    实现这一点的老技巧是在单词loop之前引入变量boolean first = true;,在单词loop的末尾说fitrst = false;,并在单词loop的开头插入“”,如下所示:

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

    此外,使用字母表列表效率极低。通常,一个集合而不是一个列表是显而易见的答案,但是在这种情况下,您可以简单地编写一个静态方法

    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格式的序列