使用递归的Java字符串比较

时间:2013-04-28 21:09:19

标签: java string recursion comparison

这是一个家庭作业,我必须从命令行比较两个字符串 参数,将它们转换为小写版本,执行 比较并打印出比其他字符串更小/更小的字符串 在字典顺序。字符串可以有任意长度。

但是,我的算法必须使用RECURSION。

我不确定是否1 - 我正在使用递归,或者2为什么它不适用于Hello和Hallo,但适用于Homework和homePhOne。

请帮助!!!

 import java.util.Scanner;


public class MyStringCompare
 {  
 public static void main(String[] args)
  {
Scanner in = new Scanner(System.in);
System.out.println("Input String 1");
String x = in.next();
String xl = toLowerCase(x);
System.out.println("Input String 2");
String y = in.next();
String yl = toLowerCase(y);


char a = xl.charAt(0);
char b = yl.charAt(0);
int min = 0;

if (a < b)
{

  System.out.println("The smallest string is " +xl);
}
if (a > b)
{

  System.out.println("The smallest string is " +yl);
}
else if (a == b)
{
  min = toCompare(xl,yl);
  if (min == -1)
  {
  System.out.println("The smallest string is " +xl);
  }
  if (min == 1)
        {
    System.out.println("The smallest string is " +yl);
  }
  else if (min == 0)
  {
    System.out.println("Two strings are equal");
  }
}



}



 public static String toLowerCase( String s )
{
   String output;
   output = "";
   int i;
   char a;
   char b;


   for (i = 0; i<s.length(); i++)
   {
     a = s.charAt(i);


     if (a >= 65 && a <= 90)
     {
         b = (char)( a+32);
        output = output + b; 
        }
        else
        {

                output = output + a; 

        }
    }

   return output;
   }


    public static int toCompare (String m, String n)
    {
   int i = 0;
    int j = 0;
    int min = 0;
 for (i = 0; i< m.length(); i++)
 {

   for (j = 0; j < n.length(); j++)
   {
     char a = m.charAt(i);

     char b = n.charAt(j);


     if (a < b)
     {
       min = -1;

     }
     if (a > b)
     {
       min = 1; 

     }
     else if (a == b)
     {

       min = 0;

     }

     }
   }





return min;
}






 }

2 个答案:

答案 0 :(得分:0)

在类声明中定义一个静态布尔变量flag = false, 将所有字符串定义为静态全局变量,这样就不必使用它们将它们传递给递归方法。

从main调用compare(0) 使用这个递归过程:

private static void compare(int i)
{  
   if(x1.length()!=x2.length())
   {
       flag =false; return;
   }
   else
   {
   if((i<x1.length())&&(i<x2.length()))
  {
   if(x1.charAt(i)==x2.charAt(i))
   {
    i++;compare(i);flag =true;
   }
   else
   flag =false; return;
  }}
}

检查标志是否为true,以查看每个字符的字符串是否相等。 这是我使用递归的程序版本。

import java.util.*;

public class sol {

static String x1;
static String x2;
static boolean flag=false;
public static void main(String args[])
{
    Scanner in = new Scanner(System.in);
    x1= (in.nextLine());
    x1=x1.toLowerCase();
    x2= (in.nextLine());
    x2=x2.toLowerCase();
    compare(0);in.close();
    if(flag==true)
        System.out.print("Strings are equal");
    else
        System.out.print("Strings are not equal");
}
private static void compare(int i)
{  
   if(x1.length()!=x2.length())
   {
       flag =false; return;
   }
   else
   {
   if((i<x1.length())&&(i<x2.length()))
  {
   if(x1.charAt(i)==x2.charAt(i))
   {
    i++;compare(i);flag =true;
   }
   else
   flag =false; return;
  }}
}
}

答案 1 :(得分:0)

执行递归方法时:

  • 研究您可能需要的参数

    -m:要比较的字符串

    -n:要比较的字符串

  • 您需要哪种基本情况? 这意味着,你的方法何时不再自称? 在这种情况下,当没有更多的字符需要比较时。

  • 递归调用您的方法: 您调用方法从左到右进行比较。 例如:hello hallo

    (1)compare hello hallo 
    
     (2)will call-> compare ello allo
    
      (3)which will call-> compare llo llo
    
       (4)which will call-> lo lo
    
        (5)which will call-> o o
    
         (6)which will call-> '' '' 
    
           which wont call more himself: no more characters left to be compared->basecase!
    
  • 收集返回的值,您将从右向左

         (6)compare '' '' will return true
    
        (5)compare 'o' 'o' will return (the result of 6)true && true ('o'=='o')  ->true
    
       (4)compare 'lo' 'lo' will return (5)true && true ('l'=='l')   ->true
    
      (3)compare 'llo' 'llo' will return (4)true && true ('l' == 'l')   ->true
    
     (2)compare 'ello' 'allo' will return (3)true && false ('e' != 'a')   ->false
    
    (1)compare 'hello' 'hallo' will return (2)false && true ('h' == 'h')   ->false