【问题标题】:Write a recursive method to compare two strings? [duplicate]写一个递归方法来比较两个字符串? [复制]
【发布时间】:2012-09-26 06:04:21
【问题描述】:

可能重复:
Using Recursion To Compare Strings To Determine Which Comes First Alphabetically Java

我被困在这个递归问题上,按字母顺序对任意两个字符串进行排序。这是方法签名:

int compareTo(String s1, String s2)

它会产生:

returnval <0 表示s1 < s2

returnval ==0 表示s1 == s2

returnval >0 表示s1 > s2

这是我的代码:

package bonushw;

public class Recursion {

  public void main (String[] args){
      Recursion recurse = new Recursion();
      System.out.println("value is: " + recurse.compareTo("bill","bill"));
    }  

  public int compareTo (String s1, String s2) {

    if(s1.length() == 0){
      return 0;
    }
    else if (s1.charAt(0) < s2.charAt(0)){
      return -1;
    }
    else if (s1.charAt(0) > s2.charAt(0)) {
      return 1;
    }
    else {
      return compareTo(s1.substring(1), s2.substring(1));
    }
  }

谢谢

【问题讨论】:

  • @AmitBhargava - 我刚刚添加了我的代码,谢谢
  • 你的代码有问题吗?它有什么问题?
  • compareTo("","Hello World") 的值应该是多少?
  • @LouisWasserman - 你觉得不错?
  • 不应该是public static void main(String[] args)(缺少static

标签: java sorting recursion


【解决方案1】:
if(s1.length() == 0){
      return 0;
    }

这是不完整的,如果两个都是空的,如果s2是空的呢?

【讨论】:

  • 好点 AKJ,是的 OP 需要彻底检查
  • 好的,我将其更改为:` (s1.length() == 0) || (s2.length() == 0)`
  • @IkechukwuOkechukwuJr 这仍然不正确。你应该有这样的条件: if(s1.length()==0 && s2.length()==0) return 0;否则 if (s1.length()==0 && s2.length()>0) 返回 -1; else if (s1.length()>0 && s2.length==0) return 1;
【解决方案2】:

试试这个:

class Compare
{
    public static int compareTo(String s1, String s2)
    {
        int len = s1.length() < s2.length() ? s1.length() : s2.length();

        if (len == 0 && s1.length() > 0)
            return -1;
        else if (len == 0 && s2.length() > 0)
            return 1;

        for (int i = 0; i < len; ++i)
        {
            int v1 = s1.charAt(i);
            int v2 = s2.charAt(i);

            if (v1 == v2)
                return compareTo(s1.substring(1, s1.length()),
                                 s2.substring(1, s2.length()));
            else
                return v1 - v2;
        }

        return 0;
    }

    public static void main(String[] args)
    {
        System.out.println(compareTo("", ""));        //  0
        System.out.println(compareTo("a", "a"));      //  0
        System.out.println(compareTo("ab", "a"));     // -1
        System.out.println(compareTo("a", "ab"));     //  1
        System.out.println(compareTo("abc", "abc"));  //  0
    }
}

【讨论】:

  • 仅供参考,而不是s1.substring(1, s1.length()),只需写s1.substring(1)。它是等效的,并且更易于阅读。
  • 您的 for 循环是不必要的,因为它将在第一次迭代后使用 return 语句退出。只需使用 s1.charAt(0)s2.charAt(0) 并删除 for 循环。
  • 感谢@guillaume-polet 的提示
猜你喜欢
  • 2017-11-19
  • 2012-07-18
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2017-04-03
  • 2012-12-23
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多