繁体   English   中英

哪个代码更有效?

[英]which code is more efficient?

以下哪一项是一种有效的方法来反转字符串中的单词?

public String Reverse(StringTokenizer st){
    String[] words = new String[st.countTokens()];
    int i = 0;
    while(st.hasMoreTokens()){
       words[i] = st.nextToken();i++}

    for(int j = words.length-1;j--)
       output = words[j]+" ";}

要么

public String Reverse(StringTokenizer st, String output){        
    if(!st.hasMoreTokens()) return output;        
        output = st.nextToken()+" "+output;
        return Reverse(st, output);}       

public String ReverseMain(StringTokenizer st){       
    return Reverse(st, "");}

虽然第一种方式似乎更具可读性和直接性,但它有两个循环。 在第二种方法中,我尝试以尾递归方式进行。 但我不确定java是否会优化尾递归代码。

但我不确定java是否会优化尾递归代码。

它没有。 或者至少Sun / Oracle Java实现不包括Java 7。

参考文献:


我不知道这是否比其他解决方案更快。 (自己测试一下......注意避免使用标准的微基准陷阱。)

但是,Java没有实现尾调用优化这一事实意味着如果你给第二个解决方案提供一个字符串数量很大(足够多)的字符串,那么第二个解决方案很可能会耗尽堆栈空间。


最后,如果您正在寻找一种更节省空间的方法来实现它,那么有一种巧妙的方法就是只使用StringBuilder

  1. 从输入String创建StringBuilder
  2. 使用reverse() StringBuilder的字符。
  3. 逐步完成StringBuilder ,识别每个单词的开始和结束偏移量。 对于每个开始/结束偏移对,反转偏移之间的字符。 (您必须使用循环执行此操作。)
  4. StringBuilder转回String

你可以在一个循环中完成这个

public String Reverse(StringTokenizer st){
    int length = st.countTokens();
    String[] words = new String[length];
    int i = length - 1;
    while(i >= 0){
      words[i] = st.nextToken();i--}
}

您可以通过对大量结果计算两者来测试结果

例如。 您可以反转100000000个字符串并查看它需要多少秒。 您还可以比较开始和结束系统时间戳,以获得两个函数之间的确切差异。

不推荐使用StringTokenizer,但是如果您阅读了当前的JavaDoc ...

StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它。 建议任何寻求此功能的人都使用String的split方法或java.util.regex包。

String[] strArray = str.split(" ");
StringBuilder sb = new StringBuilder();
for (int i = strArray.length() - 1; i >= 0; i--)
    sb.append(strArray[i]).append(" ");

String reversedWords = sb.substring(0, sb.length -1) // strip trailing space 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM