Java拼接数组元素生成最大数字时NumberFormatException问题求解
解决拼接大数时的NumberFormatException问题并生成最大组合数
问题根源
原代码中,将两个数字拼接成字符串后直接转为Integer,但当拼接后的字符串长度超过10位时,数值会超出Integer.MAX_VALUE(2147483647),无法被Integer类型容纳,从而抛出NumberFormatException。比如输入[111311, 1113]时,拼接出的"111311111311"是12位数字,远大于Integer的最大值,转换必然失败。
另外,原代码的冒泡排序逻辑存在冗余,双重循环均从0开始会导致不必要的元素交换,排序效率低下。
解决方案
不需要将拼接后的字符串转为数字,直接通过字符串字典序比较即可判断组合后的大小(数字字符的字典序与数值大小顺序一致)。同时使用自定义比较器对字符串数组排序,确保最终拼接出最大数值,还要处理全0的边界情况。
修复后的代码
import java.util.Arrays; import java.util.Comparator; public class SortNumber { public static void main(String[] args) { int[] arr = {111311, 1113}; String result = largestNumber(arr); System.out.println(result); } public static String largestNumber(int[] arr) { // 将int数组转换为字符串数组,避免数值操作的溢出问题 String[] strArr = new String[arr.length]; for (int i = 0; i < arr.length; i++) { strArr[i] = String.valueOf(arr[i]); } // 自定义比较器:比较两种拼接方式的字典序,让更大的组合排在前面 Arrays.sort(strArr, new Comparator<String>() { @Override public int compare(String s1, String s2) { String combineA = s1 + s2; String combineB = s2 + s1; // 逆序排序,确保大的组合优先排列 return combineB.compareTo(combineA); } }); // 处理全0的特殊情况,避免输出"00"这类无效结果 if (strArr[0].equals("0")) { return "0"; } // 拼接最终结果 StringBuilder sb = new StringBuilder(); for (String s : strArr) { sb.append(s); } return sb.toString(); } }
代码说明
- 字符串数组转换:直接将int数组转为字符串数组,彻底避免数值溢出问题。
- 自定义排序逻辑:通过比较
s1+s2和s2+s1的字典序,决定两个元素的排列顺序——如果s2+s1更大,则s2排在s1前面,保证整体组合数值最大。 - 边界处理:当数组全为0时,直接返回"0",避免输出"00"这类不符合要求的结果。
- 高效排序:使用
Arrays.sort配合自定义比较器,比手动实现冒泡排序更高效、更简洁。
内容的提问来源于stack exchange,提问作者Vaibhav More
相关产品推荐
相关产品推荐

