【问题标题】:Comparing 2 strings by ascii values in Java在Java中通过ascii值比较2个字符串
【发布时间】:2014-10-24 18:16:59
【问题描述】:

我必须编写一个方法来按字母顺序比较字符串并返回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));
  }
}

【问题讨论】:

  • “我不能将返回比较放在 for 循环之外”...为什么不呢?
  • breakit 在 if 语句中,您可以将 return comparison 移出循环
  • 处理比较,只需要在for循环之外定义它..
  • 如果你要比较两个字符串并且你不能使用任何“内置”函数,那么你就完蛋了。您至少需要使用charAtgetChars 来访问数据。当然,您不能使用length 来找出字符串的长度。

标签: java return compare


【解决方案1】:

如果您按字母顺序进行比较,这意味着字符串中的第一个不同字符定义了差异。例如: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 &gt; 0 意味着c1c2“大”,那么s1 更大(看我回答的第一段);如果comparison &lt; 0s2 更大。

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

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

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

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

      所以字符串相等的,必须返回一个零值。

【讨论】:

  • 感谢 Barranka 的帮助,虽然不完全理解你做了什么。我不能使用任何内置函数。但是,我用另一个 if 循环解决了这个问题。
  • @DynoDimo 如果您已经解决了比较问题,请查看我的代码示例的最后一部分;这就是处理不同字符串长度的方法...让我编辑代码以删除所有cmets
  • @DynoDimo 我已经为我的答案添加了一些解释...注释 1 到 3 处理最小长度情况,注释 4 处理不同长度情况(例如:abc 与 @ 987654356@)
  • 你是对的..我认为你的例子比我的更好更完整.. :) +1 简洁的代码
猜你喜欢
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多