不寻常的字符串比较Java

时间:2016-07-23 01:05:43

标签: java

我一直在阅读以前的字符串比较问题,并且所有这些问题都使用的方法与我使用的方法不同。也许他们的方法要好得多,但我想用我的方法来解决这个问题。我正在尝试编写一个比较两个字符串的函数,并输出一个按字母顺序排列的函数,其中大写字母始终被认为是在小写字母之前。 Java的compareTo方法不起作用,因为它在字母顺序排列时忽略了字母大小写。

我在while循环中放入一个for循环。当for循环检测到一个字符串的字母小于另一个字母的ASCII值时,它应该退出while循环并且不完成for循环,这应该发生。但是,该程序应该返回“cdf”,但它返回“dbc”,即使c在字母表中的d之前。为什么程序返回'dbc'而不是'cdf'?

public class Alphabet {
    public static String min_compare(String str1, String str2) {
        int a = 0;
        while (a == 0) {
            for (int i = 0; i < str1.length(); i++) {
                int b = (int) str1.charAt(i);
                int c = (int) str2.charAt(i);
                if (b < c) {
                    a = 1;
                } else if (b > c) {
                    a = 2;
                } else if ((b == c) && (i == (str1.length() - 1))) {
                    a = 1;
                } else {
                    a = 0;
                }
            }
        }
        if (a == 2) {
            return str2;
        } else {
            return str1;
        }
    }

    public static void main(String[] args) {
        String check = min_compare("dbc", "cdf");
        System.out.println(check);
    }
}

3 个答案:

答案 0 :(得分:1)

  1. 不需要while循环;如果在a循环结束后for为0,则再次运行for循环不会导致不同的结果,从而导致无限循环。

  2. 您为 a的每个字符设置str1;因此,a的最终值将仅由for循环的最后一次迭代确定,忽略之前的内容。

答案 1 :(得分:1)

  

Java的compareTo方法不起作用,因为它在字母顺序排列时忽略了字母大小写。

这是不正确的。 String.compareTo(String)被指定为按字典顺序排列字符串 javadoc描述如下:

  

这是字典排序的定义。如果两个字符串不同,那么它们在某个索引处有不同的字符,这两个字符串是两个字符串的有效索引,或者它们的长度是如果它们在一个或多个索引位置具有不同的字符,则令k为最小的索引;然后使用<运算符确定的位置k处的字符具有较小值的字符串,按字典顺序排在另一个字符串之前。“

如果你仔细阅读,你会发现它不会忽略大小写。此外,如果您查看Unicode代码图表,您会看到大写字母位于相应的小写字母之前...至少对于拉丁字母表中的非重音字母。

因此compareTo方法会根据您的需要订购字符串,前提是您已在问题中正确说明了您的要求。

查看您的方法,我注意到它没有实现标准int compare(String, String)签名。所以你不能用compareTo直接替换它。

我还可以看到一个错误:如果str2的前缀是str1str1的前缀更长,那么您将获得例外。

实际上,您的方法可以(正确地)重写为:

  public static String minCompare(String str1, String str2) {
      return str1.compareTo(str2) > 0 ? str2 : str1;
  }

答案 2 :(得分:1)

你提到了

  

它应该退出while循环并且不完成for循环

但是,您尚未在代码中实现它。我添加了破解嵌套循环代码。希望它会有所帮助。 THX。

public class Alphabet {

    public static String min_compare(String str1, String str2) {

        int a = 0;

        whileloop:
        while (a == 0) {
            for (int i = 0; i < str1.length(); i++) {

                int b = (int) str1.charAt(i);
                int c = (int) str2.charAt(i);
                if (b < c) {
                    a = 1;
                    break whileloop;
                } else if (b > c) {
                    a = 2;
                    break whileloop;
                } else if ((b == c) && (i == (str1.length() - 1))) {
                    a = 1;
                    break whileloop;
                }

                else {

                    a = 0;

                }
            }

        }

        if (a == 2) {
            return str2;
        } else {
            return str1;
        }
    }

    public static void main(String[] args) {

        String check = min_compare("dbc", "cdf");
        System.out.println(check);

    }
}