版本比较器3位小数
问题描述:
您好,我正在比较手机设备的版本号。如果一个版本以4.3.2的形式出现,我的程序崩溃了,所以我实现了十进制格式,但现在它只是将我的数字从4.3.2加到4.3,但是程序将会完全正常,例如4.2的版本号。我怎样才能修正我的比较器,以便能够取得3位小数,并且在仍然工作2位小数的同时不会崩溃。版本比较器3位小数
@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;
}
答
正如我在评论中提到的,你不能因为Java十进制类型不支持小数的任意数目(也不能够任意精度的基本类型)使用DecimalFormat
这里。相反,我会分割一个\\.
,然后使用迭代来测试结果令牌。类似的,
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;
}
}
答
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;
}
不要使用'DecimalFormat';我可能会拆分“\\。”,并比较结果标记。 –