尝试将自己的比较写入字符串的方法 - Java

时间:2015-03-16 16:20:48

标签: java string-comparison

[编辑]:我已经重写了所有内容,我通过开始将大多数数组都用大写字母来找到一种更为简单的方法,这种比较更容易!谢谢你的帮助:)

我是java的初学者,我必须编写自己的compareTo()方法来按字典顺序与字符串进行比较。例如,"hello""hello"应该相同,而"hello""hello world"应该给s2> s1。在大写字母的情况下,比较假设返回相同的,例如" HeLLo"和" HELLO"应该给出相同的,但是当我使用ASCII值时,我很难搞清楚这一点。最后,弦也可以具有不同的长度。

这是我到目前为止所做的事情:

public class compare
{
  public static void main(String[] args)
  {
String s1 = "HHzllozz";
String s2 = "LLLLLLellozzzzzzz";

//System.out.println(s1.length()); --> just here to check
//System.out.println(s2.length());

char char1; 
char char1b;

char char2;
char char2b;

int index = 0;
int compNb = 0; //--> keep track of the nb of comparisons done

if (s1.length()<s2.length())
{
  compNb = s1.length();
}
else
{
  compNb = s2.length();
}

System.out.println(compNb);

for(int i=0; i<compNb; i++)
{  
  char1 = s1.charAt(i);
  char1b = s1.toUpperCase().charAt(i);

  char2 = s2.charAt(i);
  char2b = s2.toUpperCase().charAt(i);

  int ascii1 = (int) char1;
  int ascii2 = (int) char2;



  if (s1.length()>s2.length())
  {
    for( int j = 0; j<s2.length(); j++)
    {
      if(ascii1 > ascii2)
      {
        index = 1;
        break;
      }
      else if(ascii1 < ascii2)
      {
        index = -1;
        break;
      }
      else
      {
        index = 1; 
      }
    }
  }

  if(s1.length()<s2.length())
  {
    for(int j = 0; j<s2.length(); j++)
    {
      if(ascii1 > ascii2)
      {
        index = 1;
        break;
      }
      else if(ascii1 < ascii2)
      {
        index = -1;
        break;
      }
      else
      {
        index = -1; 
      }
    }
  }
  if(s1.length() == s2.length())
  {

    if(ascii1 > ascii2)
    {
      index = 1;
      break;
    }
    else if(ascii1 < ascii2)
    {
      index = -1;
      break;
    }
    else if(s1.charAt(i) == s2.charAt(i) || s1.charAt(i) == s2.toUpperCase().charAt(i) || s2.charAt(i) == s1.toUpperCase().charAt(i))
    {
      index ++;

    }

  }
  //System.out.println(s1.charAt(i) + " value : "+ ascii1);
  //System.out.println(s2.charAt(i) + " value : " + ascii2);
}

System.out.println(index);

if (index == compNb && compNb !=1)
{
  System.out.println("same");
}
if(index == 1)
{
  System.out.println("S1>s2");      
}
if(index == -1)
{
  System.out.println("s2>s1");      
}
  }

}

它适用于某些情况,但不适用于所有这些情况,老实说我很遗憾。例如,在上面给出的情况中,它显示s1> s2,但情况并非如此。

1 个答案:

答案 0 :(得分:0)

首先,你在下面的陈述有点混乱。你能澄清一下:

  

如果是大写字母,比较假设不会改变,但是因为我使用的是ascii值,所以我很难搞清楚这一点。

你的逻辑似乎也很复杂。您应该尝试简化这样的事情。首先理解并定义您的解决方案,然后跳转到编码。我用简单的英语提出解决方案,但它很容易编码:

要比较2个字符串s1和s2,定义这些规则并实现它们:

  1. 如果s1的长度大于s2的长度,则返回1(或在您的情况下,s1> s2)。
  2. 如果s2的长度大于s1的长度,则返回-1(或者在您的情况下,s2> s1)。
  3. 如果长度相同,则逐个比较它们的字符,并在那些ascii值不匹配的任何步骤中断。如果s1的字符的ascii值较大,则返回s1> s2,否则返回s2&gt; s1。
  4. 当然,您必须在开头检查空值,以避免方法中出现任何不适当的异常。


    [基于OP的问题更新]

    如果您只想按字典顺序根据字符串的等级返回答案,则无需检查字符串的长度。只需执行以下操作:

    1. 通过将两个字符串的所有字母都更改为小写或大写来使字符串不区分。
    2. 为两个字符串创建2个字符串数组并按顺序迭代它们检查是否相等,这样的事情(我使用java API进行大写转换并将字符串转换为字符数组,如果你愿意,可以自己编写):

      String s1 = string1.toUppercase(); String s2 = string2.toUppercase(); char[] s1Array = s1.toCharArray(); //confirm exact API or write your method char[] s1Array = s1.toCharArray(); int lengthToConsider = (s1Array.length < s2Array.length) ? s1Array.length : s2Array.length; for(int i=0; i<lengthToConsider; i++)' { if( s1Array[i] < s2Array[i] ) { return "s2>s1"; } else if( s1Array[i] > s2Array[i] ) { return "s1>s2"; } } // if you reach here, that means all letters compared earlier are same if(s1Array.length > s2.length) { return "s1>s2"; } else if(s1Array.length < s2.length) { return "s2>s1"; } else { return "equal"; }