在Java中通过ascii值比较2个字符串

在Java中通过ascii值比较2个字符串,java,return,compare,Java,Return,Compare,我必须编写一个按字母顺序比较字符串并返回int的方法。我不能使用任何内置函数,我应该使用for循环 我不确定如何处理不同长度的弦。目前我的主要问题是代码只比较每个字符串的第一个字符,然后返回int,但我不能将放在返回比较中for循环外部 public class poop { public static int Compare(String s1, String s2) { for (int i = 0; i < s1.length() && i &

我必须编写一个按字母顺序比较字符串并返回
int
的方法。我不能使用任何内置函数,我应该使用
for
循环

我不确定如何处理不同长度的弦。目前我的主要问题是代码只比较每个字符串的第一个字符,然后返回int,但我不能将
放在返回比较中for循环外部

public class poop {
    public static int Compare(String s1, String s2) {

       for (int i = 0; i < s1.length() && i < s2.length(); i++) {

           int comparison = 0;
           int ascii1 = 0;
           int ascii2 = 0;
           //convert chars into their ascii values
           ascii1 = (int) s1.charAt(i); 
           ascii2 = (int) s2.charAt(i); 

           //treat capital letters as lower case
           if (ascii1 <= 95) {
               ascii1 += 32;
           } if (ascii2 <= 95) {
               ascii1 += 32;
           }

           if (ascii1 > ascii2) {
               comparison = 1;
           } else if (ascii1 < ascii2) {
                 comparison = -1;
           } else { 
                 comparison = 0;
           }

       } 
       return comparison;
    }

    public static void main(String[] args) {
        String s1 = "aba";
        String s2 = "aaa";
        System.out.println(Compare(s1,s2));
  }
}
public-class-poop{
公共静态整数比较(字符串s1、字符串s2){
对于(int i=0;i如果按字母顺序进行比较,则表示字符串中的第一个不同字符定义了差异。例如:
aab
位于
aac
之前,因为
c

对于不同长度的字符串,较大的字符串紧跟较小的字符串(字典使用这种约定)。因此
aaaa
紧跟
aaa
,因为
aaaa
更大

那么,让我们完成它:

/**
 * Will return an integer bigger than 1 if s1 is "bigger" than s2
 */
public static int compareStrings(String s1, String s2) {
    int comparison = 0;
    int c1, c2;
    for(int i = 0; i < s1.length() && i < s2.length(); i++) {
        c1 = (int) s1.toLowerCase().charAt(i);   // See note 1
        c2 = (int) s2.toLowerCase().charAt(i);   // See note 1
        comparison = c1 - c2;   // See note 2

        if(comparison != 0)     // See note 3
            return comparison;
    }
    if(s1.length() > s2.length())    // See note 4
        return 1;
    else if (s1.length() < s2.length())
        return -1;
    else
        return 0;
}
/**
*如果s1大于s2,则返回大于1的整数
*/
公共静态整数比较字符串(字符串s1、字符串s2){
整数比较=0;
int c1,c2;
对于(int i=0;is2.length())//参见注释4
返回1;
else if(s1.length()
注:

  • 我使用
    toLowerCase()
    方法将字符串转换为小写。如果不能使用任何“内置”方法,可以使用转换(即
    ASCII+=32
    段)。但是,必须小心:在像这样转换字符之前,必须检查字符值是否为字母字符(使用google查找ASCII表并检查哪些是有效的字母字符值)
  • c1
    c2
    是整数,因此
    comparison=c1-c2
    将保留这些整数(字符)之间的差异
  • 如果
    comparison==0
    ,这意味着字符相等,所以什么也不做。但是如果
    comparison!=0
    ,字符不同;如果
    comparison>0
    ,这意味着
    c1
    c2
    大,所以
    s1
    更大(看我答案的第一段);如果
    比较<0
    s2
    更大。 因此,如果
    comparison!=0
    ,则可以返回其值。记住:
    return
    语句执行两件事:返回值并退出函数。因此
    for
    循环的执行也会停止
  • 前面的代码解决了最小字符串长度的问题。但是,正如您在问题中所述,您必须处理字符串具有不同长度的情况。代码的最后一部分处理这些字符串(只有当
    比较
    仍然为
    0
    时,才能达到此目的):
    • 如果
      s1.lenght()>s2.length()
      ,则
      s1
      大于
      s2
      ,因此返回正值(
      +1
    • 如果
      s1.lenght()
      ,则
      s1
      s2
      小,因此返回负值(
      -1
    • 在任何其他情况下,这意味着两件事: (a) 两个字符串的所有字符都相等(因为
      比较==0
      ),并且 (b) 两个字符串的长度相等 因此字符串相等,必须返回零值

  • “我不能将返回比较;放在for循环之外”…为什么不?
    在if语句中中断它,您可以将
    返回比较
    移到循环之外处理比较,只需在for循环之外定义它..如果您要比较两个字符串,并且不能使用任何“内置”函数然后你就被套住了。你至少需要使用
    charAt
    getChars
    来访问数据。当然,你不能使用
    length
    来确定字符串的长度。感谢Barranka的帮助,尽管他不完全理解你做了什么。我不能使用任何内置函数。但是,我解决了这个问题使用另一个if循环。@DynoDimo如果您已经解决了比较问题,请查看我的代码示例的最后一部分;这是处理不同字符串长度的方法……让我编辑代码以删除所有comments@DynoDimo我在我的答案中添加了一些解释……注释1到3处理最小长度的情况,注释4d对于不同长度的案例(例如:
    abc
    vs
    abcabc
    ),您是对的。我认为您的示例比我的示例更好、更完整。:)对于简洁的代码+1