【问题标题】:How to flip two words in a string, Java如何翻转字符串中的两个单词,Java
【发布时间】:2012-01-10 23:18:02
【问题描述】:

假设我有一个名为 x 的字符串 =“Hello world”。我想以某种方式让它翻转这两个词,而是显示“世界你好”。我不太擅长循环或数组,显然是初学者。我可以通过拆分字符串以某种方式完成此操作吗?如果是这样,怎么做?如果没有,我该怎么做?将不胜感激,谢谢!

【问题讨论】:

    标签: java string split swap flip


    【解决方案1】:

    1) 将字符串拆分为空间上的String 数组。

    String myArray[] = x.split(" ");
    

    2) 从数组中逆序创建新的字符串。

    String newString = myArray[1] + " " + myArray[0];
    

    使用 StringBuilder 而不是串联的奖励积分。

    【讨论】:

    • 两个词使用StringBuilder? Java 将自己完成这一切。过早的优化?
    • @owlstead - 扩展;虽然以上内容不保证使用StringBuilder,但很高兴了解它以及在java中使用字符串连接的陷阱。鉴于 OP 的明显初学者水平,在它咬他之前尽早学习对他来说是一件好事;)
    • @BrianRoach - 如果你要教一堂课,那应该是一堂正确的课。在大多数情况中,使用StringBuilder而不是+不好的做法
    • @StephenC - AFAIK 编译器会尽其所能为您做到这一点,Josh Bloch 在他的书中对此非常清楚。有什么改变?我很高兴悔改:)
    • @BrianRoach 为此使用了一个字符串生成器:System.out.println(reverseWords("Owlstead is 01 very \"strange bïrd\"!")); 得到!"bïrd strange" very 01 is owlsteaD
    【解决方案2】:
    String abc = "Hello world";
    String cba = abc.replace( "Hello world", "world Hello" );
    
    abc = "This is a longer string. Hello world. My String";
    cba = abc.replace( "Hello world", "world Hello" );
    

    如果你愿意,你也可以分解你的字符串:

    String[] pieces = abc.split(" ");
    for( int i=0; i<pieces.length-1; ++i )
        if( pieces[i]=="Hello" && pieces[i+1]=="world" ) swap(pieces[i], pieces[i+1]);
    

    还有很多其他方法可以做到这一点。注意大小写。您可以在 if 语句中使用 .toUpperCase() ,然后将匹配的条件变为大写,但将结果保留为原始大写等。

    【讨论】:

    • 不知何故,我不认为 Lanuk 正在寻找一个只是用另一个字符串替换这两个词的答案。
    • hello world 只是一个例子。该示例不适用于其他字符串
    • 我假设你看到了我的帖子的其余部分以及 @owlstead 的爆炸声明?
    【解决方案3】:

    解决办法如下:

    import java.util.*;
    
    public class ReverseWords {
        public String reverseWords(String phrase) {
            List<String> wordList = Arrays.asList(phrase.split("[ ]"));
            Collections.reverse(wordList);
    
            StringBuilder sbReverseString = new StringBuilder();
            for(String word: wordList) {
                sbReverseString.append(word + " ");
            }
    
            return sbReverseString.substring(0, sbReverseString.length() - 1);
        }
    }
    

    上面的解决方案是我为 Google Code Jam 编写的,也在这里写博客:Reverse Words - GCJ 2010

    【讨论】:

      【解决方案4】:

      只要使用这个方法,调用它并传递你想要拆分出来的字符串

      static String reverseWords(String str) {
      
          // Specifying the pattern to be searched
          Pattern pattern = Pattern.compile("\\s");
      
          // splitting String str with a pattern
          // (i.e )splitting the string whenever their
          //  is whitespace and store in temp array.
          String[] temp = pattern.split(str);
          String result = "";
      
          // Iterate over the temp array and store
          // the string in reverse order.
          for (int i = 0; i < temp.length; i++) {
              if (i == temp.length - 1) {
                  result = temp[i] + result;
              } else {
                  result = " " + temp[i] + result;
              }
          }
          return result;
      }
      

      【讨论】:

        【解决方案5】:

        根据您的具体要求,您可能希望拆分为其他形式的空白(制表符、多个空格等):

        static Pattern p = Pattern.compile("(\\S+)(\\s+)(\\S+)");
        public String flipWords(String in)
        {
            Matcher m = p.matcher(in);
            if (m.matches()) {
                // reverse the groups we found
                return m.group(3) + m.group(2) + m.group(1);
            } else {
                return in;
            }
        }
        

        如果您想变得更复杂,请参阅 Pattern http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html 的文档

        【讨论】:

          【解决方案6】:

          尝试以下方法:

          String input = "how is this";
          List<String> words = Arrays.asList(input.split(" "));
          Collections.reverse(words);
          String result = "";
          for(String word : words) {
              if(!result.isEmpty()) {
                  result += " ";
              }
              result += word;
          }
          System.out.println(result);
          

          输出:

          这就是

          【讨论】:

            【解决方案7】:

            太多了?

            private static final Pattern WORD = Pattern.compile("^(\\p{L}+)");
            private static final Pattern NUMBER = Pattern.compile("^(\\p{N}+)");
            private static final Pattern SPACE = Pattern.compile("^(\\p{Z}+)");
            
            public static String reverseWords(final String text) {
                final StringBuilder sb = new StringBuilder(text.length());
            
                final Matcher wordMatcher = WORD.matcher(text);
                final Matcher numberMatcher = NUMBER.matcher(text);
                final Matcher spaceMatcher = SPACE.matcher(text);
            
                int offset = 0;
                while (offset < text.length()) {
            
                    wordMatcher.region(offset, text.length());
                    numberMatcher.region(offset, text.length());
                    spaceMatcher.region(offset, text.length());
            
                    if (wordMatcher.find()) {
                        final String word = wordMatcher.group();
                        sb.insert(0, reverseCamelCase(word));
                        offset = wordMatcher.end();
                    } else if (numberMatcher.find()) {
                        sb.insert(0, numberMatcher.group());
                        offset = numberMatcher.end();
                    } else if (spaceMatcher.find()) {
                        sb.insert(0, spaceMatcher.group(0));
                        offset = spaceMatcher.end();
                    } else {
                        sb.insert(0, text.charAt(offset++));
                    }
                }
            
                return sb.toString();
            }
            
            private static final Pattern CASE_REVERSAL = Pattern
                    .compile("(\\p{Lu})(\\p{Ll}*)(\\p{Ll})$");
            
            private static String reverseCamelCase(final String word) {
                final StringBuilder sb = new StringBuilder(word.length());
                final Matcher caseReversalMatcher = CASE_REVERSAL.matcher(word);
                int wordEndOffset = word.length();
                while (wordEndOffset > 0 && caseReversalMatcher.find()) {
                    sb.insert(0, caseReversalMatcher.group(3).toUpperCase());
                    sb.insert(0, caseReversalMatcher.group(2));
                    sb.insert(0, caseReversalMatcher.group(1).toLowerCase());
                    wordEndOffset = caseReversalMatcher.start();
                    caseReversalMatcher.region(0, wordEndOffset);
                }
                sb.insert(0, word.substring(0, wordEndOffset));
                return sb.toString();
            }
            

            【讨论】:

              猜你喜欢
              • 2019-09-27
              • 2013-04-01
              • 2015-06-07
              • 2021-04-28
              • 1970-01-01
              • 2011-09-15
              • 1970-01-01
              相关资源
              最近更新 更多