1 importjava.util.Arrays;2
3 /**
4 *5 *@authorAdministrator6 *7 */
8 public classTestUtil {9 private int[] arrysMin = null;10
11 private int[] arrysMax = null;12
13 private int matchNum = 0;14
15 private boolean hasMatched = false;16
17 /**
18 * 返回数组的所有元素的总和19 *20 *@paramarrays21 * 待计算数组22 *@return所有元素的总和值23 */
24 public int getArraySum(int[] arrays) {25 int sum = 0;26 if (null !=arrays) {27 for (inti : arrays) {28 sum +=i;29 }30 }31 returnsum;32 }33
34 /**
35 * 返回数组的差值36 *37 *@paramarray138 * 集合一39 *@paramarray240 * 集合二41 *@return差值42 */
43 public int getTowArraysMacth(int[] array1, int[] array2) {44 Integer l1 =getArraySum(array1);45 Integer l2 =getArraySum(array2);46
47 if ((l1 - l2) / 2 > 0) {48 arrysMax =array1;49 arrysMin =array2;50 return (l1 - l2) / 2;51 } else{52 arrysMax =array2;53 arrysMin =array1;54 return (l2 - l1) / 2;55 }56 }57
58 private boolean isReturn(int[] arrayMax, int[] arrayMin) {59 Integer l1 =getArraySum(arrayMax);60 Integer l2 =getArraySum(arrayMin);61
62 if ((l1 - l2) > 0) {63 return false;64 } else{65 return true;66 }67 }68
69 public voiddoMatch() {70 //保证大的数组总和永远是大的,以防递归进入死循环
71 if(isReturn(arrysMax, arrysMin)) {72 return;73 }74 //获取元素总和大的与小的差值平均值
75 int diff =getTowArraysMacth(arrysMax, arrysMin);76 //使用一个大数字初始化最小绝对值,后面做比较
77 int abs =getArraySum(arrysMax);78 int tempElement = 0;79 //最终大数组要交换的下标
80 int maxIndex = -1;81 int minIndex = -1;82 if (null != arrysMax && null !=arrysMin) {83 for (int i = 0; i < arrysMax.length; i++) {84 for (int j = 0; j < arrysMin.length; j++) {85 int temp = arrysMax[i] -arrysMin[j];86 if (temp > 0 && diff >temp) {87 //如果元素差值和元素总和大的与小的差值平均值正好相等,直接交换元素OK
88 if (Math.abs(diff - temp) == 0) {89 tempElement =arrysMin[j];90 arrysMin[j] =arrysMax[i];91 arrysMax[i] =tempElement;92 matchNum++;93 hasMatched = true;94 return;95 } else{96 //否则完全遍历,最终找出元素差值和总和差值平均值差距最小的两元素,
97 if (abs > Math.abs(diff -temp)) {98 abs = Math.abs(diff -temp);99 maxIndex =i;100 minIndex =j;101 }102 }103 }104 }105 }106 //如果没有找到匹配项,且在已变换的数组中找到了满足条件的变量,则继续递归
107 if (!hasMatched && (maxIndex != -1 || minIndex != -1)) {108 //交换差距最小的两元素
109 System.out.printf("第%d次交换, Max[%d]:%d, Min[%d]:%d\n", ++matchNum, maxIndex, arrysMax[maxIndex], minIndex, arrysMin[minIndex]);110 tempElement =arrysMin[minIndex];111 arrysMin[minIndex] =arrysMax[maxIndex];112 arrysMax[maxIndex] =tempElement;113 System.out.println("交换后Max数组:" +Arrays.toString(arrysMax));114 System.out.println("交换后Min数组:" +Arrays.toString(arrysMin));115 System.out.println();116 //递归
117 doMatch();118 }119 }120 }121
122 public intgetMatchNum() {123 returnmatchNum;124 }125
126 /**
127 *@paramargs128 */
129 public static voidmain(String[] args) {130 TestUtil tu = newTestUtil();131 int[] a1 = { 11, 2, 4, 6, 47};132 int[] a2 = { 4, 5, 8, 9, 2};133 System.out.println("交换前数组a1:" +Arrays.toString(a1));134 System.out.println("交换前数组a2:" +Arrays.toString(a2));135 //进行第一次分出,两元素的总和谁大谁小
136 tu.getTowArraysMacth(a1, a2);137 //开始进行处理交换
138 tu.doMatch();139 //打印交换结果
140 System.out.println("交换次数:" +tu.getMatchNum());141 System.out.println("a1数组元素和:" +tu.getArraySum(a1));142 System.out.println("a2数组元素和:" +tu.getArraySum(a2));143 System.out.println("交换后原数组a1:" +Arrays.toString(a1));144 System.out.println("交换后原数组a2:" +Arrays.toString(a2));145 }146 }