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

标签 java return compare

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

我不确定如何处理不同长度的字符串。目前我的主要问题是代码仅比较每个字符串的第一个字符然后返回 int,但我不能将 return Comparison; 放在 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));
  }
}

最佳答案

如果按字母顺序比较,则意味着字符串中的第一个不同字符定义了差异。例如: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;
}

注释:

  1. 我使用toLowerCase()方法将字符串转换为小写。如果您无法使用任何“内置”方法,则可以使用您的转换(即 ASCII += 32 部分)。但是,您必须小心:在像这样转换之前,您必须检查字符值是否为字母字符(使用 google 查找 ASCII 表并检查哪些是有效的字母字符值)
  2. c1c2是整数,所以 comparison = c1 - c2将保存这些整数(字符)之间的差异。
  3. 如果comparison == 0 ,这意味着字符是相等的,所以什么也不做。但如果comparison != 0 ,字符不同;如果comparison > 0这意味着 c1c2“更大” ,所以s1更大(看我答案的第一段);如果comparison < 0然后s2更大。

    所以,如果comparison != 0 ,那么你可以返回它的值。请记住:return句子做了两件事:返回一个值并退出函数。所以执行for循环也停止了。

  4. 前面的代码解决了最小字符串长度的问题。但是,正如您的问题中所发布的,您必须处理字符串长度不同的情况。代码的最后一部分处理它们(只有当 comparison 仍然是 0 时才能到达):
    • 如果s1.lenght() > s2.length() ,然后s1s2“更大” ,因此返回正值 ( +1 )。
    • 如果s1.lenght() < s2.length() ,然后s1s2“小” ,因此返回负值 ( -1 )。
    • 在任何其他情况下,这都意味着两件事:

      (a) 两个字符串的所有字符都相等(因为 comparison == 0 ),并且

      (b) 两个字符串的长度相等

      因此字符串相等,并且必须返回零值。

关于java - 在Java中通过ascii值比较2个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26553889/

相关文章:

return - 从函数返回语句转到数组 slice

c++ - 这是正确的 uint64_t 比较吗?

java - 如果 5<10>5<10 到 n,如何在 java 中检查

c - 如何通过两个函数处理返回值

c++ - 隐式将返回的左值视为右值

c# - 逐字节比较文件还是读取所有字节?

java - Intellij 项目 View : not show multiple classes in same file

Java - 具有 thread.sleep 的多个线程的不同绘制

java - 第二种方法扫描仪不起作用

java - Eclipse 错误 : javax. imageio.IIOException:无法读取输入文件