理解java中的compareto()方法

时间:2014-09-10 18:37:03

标签: java recursion compareto

我遇到麻省理工学院关于递归的讲座,他们使用递归检查回文,然后他们使用逻辑检查它,他们比较第一个和最后一个字母表等等。 我认为的是以下内容

只是一个伪代码:

    String original="abba";

    String reverse = "";
    for(int i=original.length()-1;i>=0;i--)
    {
        reverse+=new String(original.substring(i,i+1));
    }
    if(original.equals(reverse))
        System.out.println("palindrome");
    else
        System.out.println("not palindrome");

我有两个疑惑

  • 这个逻辑在时间复杂度方面比递归或传统逻辑更好吗?
  • compareTo()方法如何检查字符串是否相等?它比较字节码还是什么?

4 个答案:

答案 0 :(得分:3)

您应该使用equals,而不是compareTo,因为compareTo会返回一个int,而不是您if条件所期望的布尔值。或者,您可以检查if (original.compareTo(reverse)==0),这意味着字符串相等。

关于compareTo如何工作,它比较具有相同索引的每对字符,并返回第一个非相等对之间的差异。如果all相等,则返回0。

答案 1 :(得分:1)

CompareTo将遍历字符串中的每个字符。如果角色更大/更小(基于字母顺序),它将返回正/负数。

因此当string1.compareTo(reverseString)==0两个字符串相同时。 (没有单个字母小于/大于另一个字母中的字母)

由于您没有提供递归实现,因此很难对性能特征做出任何说明。

答案 2 :(得分:1)

  

这个逻辑在方面比递归或传统逻辑更好   时间复杂度?

假设您使用以下递归方法,

public static boolean isPal(String s)
    {
        if(s.length() == 0 || s.length() == 1)
            return true; 
        if(s.charAt(0) == s.charAt(s.length()-1))
            return isPal(s.substring(1, s.length()-1));
        return false;
    }

时间复杂度:O(n)

<强>等于:

public boolean equals(Object paramObject)
  {
    if (this == paramObject) {
      return true;
    }
    if ((paramObject instanceof String))
    {
      String str = (String)paramObject;
      int i = this.value.length;
      if (i == str.value.length)
      {
        char[] arrayOfChar1 = this.value;
        char[] arrayOfChar2 = str.value;
        for (int j = 0; i-- != 0; j++) {
          if (arrayOfChar1[j] != arrayOfChar2[j]) {
            return false;
          }
        }
        return true;
      }
    }
    return false;
  }

程序的复杂程度为:O(n)+ O(n)= O(n)


  

compareTo()方法如何检查字符串是否相等?可以   比较字节码或什么?

compareTo:如果两个字符串相同则返回0,否则返回第一个不匹配字符的差异,整数差异(即Unicode值的差异),

通过比较两个字符串的相同位置的字符

来实现
  public int compareTo(String paramString)
  {
    int i = this.value.length;
    int j = paramString.value.length;
    int k = Math.min(i, j);
    char[] arrayOfChar1 = this.value;
    char[] arrayOfChar2 = paramString.value;
    for (int m = 0; m < k; m++)
    {
      int n = arrayOfChar1[m];
      int i1 = arrayOfChar2[m];
      if (n != i1) {
        return n - i1;
      }
    }
    return i - j;
  }

答案 3 :(得分:0)

1:就时间复杂度而言,这种逻辑比递归或传统逻辑更好 在Java中,与迭代(通常)相比,递归相当昂贵,因为它需要分配新的堆栈帧。 如果你正在使用像C这样的函数式语言,递归可能会更快。如果您使用像Java这样的命令式语言,迭代可能会更快。

2:compareTo()方法如何检查字符串是否相等

如果参数是一个按字典顺序排列等于该字符串的字符串,则值为0;如果参数是按字典顺序大于此字符串的字符串,则小于0的值;如果参数是一个按字典顺序小于该字符串的字符串,则值大于0。