【问题标题】:string comparing doesn't return right answere字符串比较不返回正确的答案
【发布时间】:2013-08-28 10:27:56
【问题描述】:

我想用 compareTo() 函数比较两个字符串。

示例:

int result = "650".compareTo("651");
    if(result < 0){
        System.out.println("smaller");
    } else if(result > 0){
        System.out.println("bigger");
    } else {
        System.out.println("equals");
    }
    System.out.println(result);

这将输出更小,这是正确的。

示例 2:

int result = "650".compareTo("1000");
    if(result < 0){
        System.out.println("smaller");
    } else if(result > 0){
        System.out.println("bigger");
    } else {
        System.out.println("equals");
    }
    System.out.println(result);

这将作为输出更大返回。这有点奇怪,因为 650 因为数字小于 1000。

怎么样,我该如何改变它? (是的,数字必须是文本格式)。

我想这样做:

int result = "650/65".compareTo("1050/50");
    if(result < 0){
        System.out.println("smaller");
    } else if(result > 0){
        System.out.println("bigger");
    } else {
        System.out.println("equals");
    }

这会返回“650/65”大于“1050/50”但实际上它更小。

编辑

我已经解决了这些案例,现在是这样的:

String maat = "650/65";
    int subMaatB = 0;
    int subMaatA = 0;

    if(maat.contains("/")){
        try{
            subMaatA = Integer.parseInt(maat.substring(0, maat.lastIndexOf("/")));
            subMaatB = Integer.parseInt(maat.substring(maat.lastIndexOf("/")+1));
        } catch (NumberFormatException e){

        }
    }

    boolean resultA = subMaatA >= 440;
    boolean resultB = subMaatB >= 65;
    boolean resultC = subMaatA <= 1050;
    boolean resultD = subMaatB <= 50;
    if(resultA && resultB && resultC && resultD){
        System.out.println("BIGGER");
    } else {
        System.out.println("Smaller");
    }

因此,Maat 必须在 440/65 和 1050/50 的范围内。 Maat 应该在我之前提到的范围之间。

【问题讨论】:

  • 这里的关键点是数据类型很重要。对于不同的类型,比较的含义可能不同。字符串比较是关于 Unicode 字符排序,而不是关于整数或有理数。

标签: java string compare compareto


【解决方案1】:

"3".compareTo("2")"three".compareTo("two")

意味着它们都是字符串比较。

String.compareTo()

按字典顺序比较两个字符串。比较基于 字符串中每个字符的 Unicode 值。字符序列 由此 String 对象表示的按字典顺序与 由参数字符串表示的字符序列。结果是一个 如果此 String 对象按字典顺序位于 参数字符串。如果此字符串,则结果为正整数 对象按字典顺序跟随参数字符串。结果是 如果字符串相等,则为零; compareTo 返回 0 时正好 equals(Object) 方法将返回 true。

这是字典顺序的定义。如果两个字符串是 不同,那么它们在某个索引处有不同的字符 这是两个字符串的有效索引,或者它们的长度是 不同,或两者兼而有之。如果他们有一个或多个不同的字符 索引位置,设 k 为最小的此类索引;然后字符串 其在位置 k 处的字符具有较小的值,由下式确定 使用

this.charAt(k)-anotherString.charAt(k) 如果没有索引 它们不同的位置,然后是较短的字符串 按字典顺序排列在较长的字符串之前。在这种情况下, compareTo 返回字符串长度的差值——也就是说, 价值:

如果要将它们作为整数进行比较,则必须先将它们转换为整数。

【讨论】:

    【解决方案2】:

    您在这些示例中比较的是字符串而不是整数。在这种情况下,结果将是字母比较。 '6' 是 > '1' 不管后面的字符是什么。

    【讨论】:

    • 问题出在轮胎尺寸上,轮胎尺寸写成像 620/75R38 这样的字符串,我删除了 R38,因为这无关紧要。但是我必须看看轮胎尺寸是否在 620/75-1050/50 之间。所以因此我确实想使用字符串 compareTo(),但我想那是不可能的?
    • 我想如果我在 620 和 1050 中进一步拆分字符串,我可以让它工作,然后看看哪个更大。放回字符串,并以同样的方式检查最后一位数字?
    【解决方案3】:

    字符串比较按字典顺序比较字符串,因此“6...”大于“1...”。要比较数值,您应该将字符串转换为数值类型

    【讨论】:

      【解决方案4】:

      在比较之前,您需要通过(例如)Integer.parseInt(String) 将字符串转换为数字。

      目前您正在比较实际的字符串内容。这与你是否写过 1000 无关。它不会将其解释为数字。

      【讨论】:

        【解决方案5】:

        试试这个

        int inputOne = Integer.parseInt("650");
        int inputTwo = Integer.parseInt("1000");
        int result = inputOne - inputTwo;
            if(result < 0){
                System.out.println("smaller");
            } else if(result > 0){
                System.out.println("bigger");
            } else {
                System.out.println("equals");
            }
            System.out.println(result);
        

        【讨论】:

          【解决方案6】:

          您可以使用 compareTo() 方法将两个数字作为字符串进行比较。

          compareTo()

          compareTo() 方法使用基于 unicode 的值。这意味着如果您使用 compareTo() 方法,它会按字母顺序对其进行排序。此外,compareTo() 方法大多只用于取值,实现了 Comperable 接口。

          如果你想比较两个字符串,你必须使用

          string.equals(comparestring);
          

          对于您的示例,您必须将字符串转换为整数。你这样做:

          Integer.parseInt(string);
          

          如果您想将其返回为字符串,因为您想将其放入字符串 LinkedList 或仅作为输出,请使用:

          string.toString();
          

          【讨论】:

            猜你喜欢
            • 2020-10-10
            • 2018-08-05
            • 2013-05-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-03
            • 1970-01-01
            • 2020-10-04
            相关资源
            最近更新 更多