-1

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

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

我不确定 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;
}






 }
4

2 回答 2

0

执行递归方法时:

  • 研究您可能需要哪些参数

    -m:要比较的字符串

    -n:要比较的字符串

  • 您需要哪种基本情况?这意味着,你的方法什么时候停止调用自己?在这种情况下,当没有更多字符可供比较时。

  • 递归调用你的方法:你调用从左到右比较的方法。例如:你好,你好

    (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
    
于 2013-04-28T21:54:14.923 回答
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;
  }}
}

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

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;
  }}
}
}
于 2013-04-28T21:36:48.880 回答