最近在网上看到这样一个题目,自己琢磨了一下。
java version "1.8.0_40"
// 编写一个能将给定非负整数数组中的数字排列成最大数字的函数。 // 例如,给定[50,2,1,9],最大数字为95021。 public class Sort { public static void main(String args[]){ int number[] = {1,2,3,32,335,34,7,6,9}; int number1[] = {312,321,3354,222,8}; System.out.println(SortMax(number)); System.out.println(SortMax(number1)); } public static String SortMax(int num[]){ int number[] = new int[num.length]; for (int i = 0; i < num.length; i++) { number[i] = num[i]; } int max = 0; int min = 0; StringBuffer s = new StringBuffer(); for (int i = 0; i < number.length; i++) { for (int j = i + 1; j < number.length; j++) { Integer x = number[i]; Integer y = number[j]; int tempX = Integer.parseInt(x.toString() + "" + y.toString()); int tempY = Integer.parseInt(y.toString() + "" + x.toString()); //关键点,转为String类型拼接起来,再转回int类型进行比较 if(tempX > tempY){ max = x; min = y; } else{ max = y; min = x; } number[i] = max; number[j] = min; } } for (int i = 0; i < number.length; i++) { s.append(number[i]); } return s.toString(); } } /*Output: 9763433533221 83354321312222 *///:输出String类型程序的关键点在于拼接比较大小。两个for循环嵌套实现排序。x和y是Integer对象。内层for循环开始时就要进行一次赋值。我始终是用number[i]来进行比较。
如果不重新赋值,会造成意想不到的错误。比如下面这个例子,在内层for循环前初始化x。
// 错误示范 // 未重新初始化对象 public class Sort { public static void main(String args[]){ int number[] = {1,2,3,32,335,34,7,6,9}; int number1[] = {9,8,55,222,8}; System.out.println(SortMax(number)); System.out.println(SortMax(number1)); } public static String SortMax(int num[]){ int number[] = new int[num.length]; for (int i = 0; i < num.length; i++) { number[i] = num[i]; } int max = 0; int min = 0; StringBuffer s = new StringBuffer(); for (int i = 0; i < number.length; i++) { Integer x = number[i]; //把x放到内层for循环前面 for (int j = i + 1; j < number.length; j++) { // 差异处 Integer y = number[j]; int tempX = Integer.parseInt(x.toString() + "" + y.toString()); int tempY = Integer.parseInt(y.toString() + "" + x.toString()); //关键点,转为String类型拼接起来,再转回int类型进行比较 if(tempX > tempY){ max = x; min = y; } else{ max = y; min = x; } number[i] = max; number[j] = min; } } for (int i = 0; i < number.length; i++) { s.append(number[i]); } return s.toString(); } } /*Output: 911111111 这是个错误的结果 98855222 这个结果竟是正确的 *///:输出String类型在这个错误范例中,内层for循环跑完一次后,Integer对象y被回收,对象x包含的值是1。number[0] == 2 ,number[1] ==1,x的value为1。内层for循环中j = 2,
对象x的值1会与number[2]进行比较。排序后,number[2] == 1,number[0] == 3。以此类推,数组number接下来的值都会变成1。
原文地址:http://blog.csdn.net/liufish992/article/details/45727379