有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java版本比较器小数点后3位

您好,我正在尝试比较手机设备的版本号。如果版本为4.3.2,我的程序会崩溃,所以我实现了十进制格式,但现在它只是将我的数字从4.3.2四舍五入到4.3,但是如果版本号为4.2之类的话,程序就完全可以了。我如何修复我的比较器,使其能够接受3个小数而不会崩溃,同时仍在工作2个小数

        @Override
        public int compare(InventoryCardViewModel lhs, InventoryCardViewModel rhs) {

            Phone lhp = phoneDataSource.getPhoneByDeviceID(lhs.getPhoneDeviceID.getValue());
            Phone rhp = phoneDataSource.getPhoneByDeviceID(rhs.getPhoneDeviceID.getValue());

            if(!lhp.versionNumber.equals(rhp.versionNumber)) {
                DecimalFormat df =  new DecimalFormat("#.#.#", new DecimalFormatSymbols(new Locale("en_US")));
                try {
                    lhp.versionNumber = String.valueOf(df.parse(lhp.versionNumber).doubleValue());
                    rhp.versionNumber = String.valueOf(df.parse(lhp.versionNumber).doubleValue());
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                if (Double.valueOf(lhp.versionNumber) > Double.valueOf(rhp.versionNumber)) {
                    return -1;
                } else {
                    return 1;
                }

共 (2) 个答案

  1. # 1 楼答案

    正如我在评论中提到的,您不能在这里使用DecimalFormat,因为Java decimal类型不支持任意数量的小数(原语类型也不支持任意精度)。相反,我将在\\.上拆分,然后使用迭代来测试生成的令牌。大概

    public class VersionComparator implements Comparator<String> {
        @Override
        public int compare(String left, String right) {
            /* Handle nulls. */
            if (left == null) {
                if (right == null) {
                    return 0;
                }
                return -1;
            } else if (right == null) {
                return 1;
            }
            /* Generate tokens */
            String[] lTokens = left.split("\\.");
            String[] rTokens = right.split("\\.");
    
            int len = Math.max(lTokens.length, rTokens.length);
            for (int i = 0; i < len; i++) {
                /* Check if both sides still have tokens */
                if (i < lTokens.length && i < rTokens.length) {
                    int a = Integer.parseInt(lTokens[i]);
                    int b = Integer.parseInt(rTokens[i]);
    
                    if (a < b) {
                        return -1;
                    } else if (a > b) {
                        return 1;
                    }
                } else if (i < rTokens.length) {
                    /* No more tokens on the left hand side */
                    return -1;
                } else {
                    /* No more tokens on the right hand side */
                    return 1;
                }
            }
            return 0;
        }
    }
    
  2. # 2 楼答案

    int compareVersions(String v1, String v2) {
        final String[] split1 = v1.split( "[.]" );
        final String[] split2 = v2.split( "[.]" );
    
        for ( int i = 0; i < split1.length; i++ ) {
            if ( i < split2.length ) {
                final int compare = Integer.valueOf( split1[ i ] )
                                           .compareTo( Integer.valueOf( split2[ i ] ) );
    
                if ( compare != 0 ) {
                    return compare;
                }
            }
            else {
                return 1;
            }
        }
    
        return split1.length == split2.length ? 0 : -1;
    }