/**
*
*/
package com.qrj.point24;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author renjie.que
*
*/
public class BizProcess {
public List<MiddleData> firstStep(Integer[] arrObjs) {
DecimalFormat decfmt = new DecimalFormat("##0.00000");
List<MiddleData> lstMiddleData = new ArrayList<MiddleData>();
// 先从中拿出1个数字,拼装对象
for (int i = 0; i < arrObjs.length; i++) {
for (OperaEnum operaEnum : OperaEnum.values()) {
MiddleData middleDataObj = new MiddleData();
middleDataObj.unUsedDatas = new Integer[arrObjs.length - 1];
int k = 0;
for (int j = 0; j < arrObjs.length; j++) {
if (j != i) {
middleDataObj.unUsedDatas[k++] = arrObjs[j];
}
}
if (operaEnum == OperaEnum.PLUS) {
middleDataObj.usedExpr = "+" + arrObjs[i];
middleDataObj.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE
* 1.0 - arrObjs[i] * 1.0));
} else if (operaEnum == OperaEnum.MINUS) {
middleDataObj.usedExpr = "-" + arrObjs[i];
middleDataObj.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE
* 1.0 + arrObjs[i] * 1.0));
} else if (operaEnum == OperaEnum.MULTIPLY) {
middleDataObj.usedExpr = "*" + arrObjs[i];
middleDataObj.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE
* 1.0 / arrObjs[i] * 1.0));
} else if (operaEnum == OperaEnum.DIVIDE) {
middleDataObj.usedExpr = "/" + arrObjs[i];
middleDataObj.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE
* 1.0 * arrObjs[i] * 1.0));
}
lstMiddleData.add(middleDataObj);
}
//第2种情况
for (OperaEnum operaEnum : OperaEnum.values()) {
MiddleData middleDataObj = new MiddleData();
middleDataObj.unUsedDatas = new Integer[arrObjs.length - 1];
int k = 0;
for (int j = 0; j < arrObjs.length; j++) {
if (j != i) {
middleDataObj.unUsedDatas[k++] = arrObjs[j];
}
}
if (operaEnum == OperaEnum.MINUS) {
middleDataObj.usedExpr2 = arrObjs[i] + "-";
middleDataObj.expectedValueForUnusedDatas2 = Double.parseDouble(decfmt.format(arrObjs[i] * 1.0 - Point24.EXPECTED_VALUE));
lstMiddleData.add(middleDataObj);
} else if (operaEnum == OperaEnum.DIVIDE) {
middleDataObj.usedExpr2 = arrObjs[i] + "/";
middleDataObj.expectedValueForUnusedDatas2 = Double.parseDouble(decfmt.format(arrObjs[i] * 1.0 / Point24.EXPECTED_VALUE));
lstMiddleData.add(middleDataObj);
}
}
}
//生成全排列
Arrange arrange = new Arrange();
arrange.perm(arrObjs, 0, 3);
//从每个全排列行中拿出2个数字,拼成对象。
List<UsedAndLeft> usedAndLeftList = arrange.getComb(arrange.getAllArrangedList(), 2);
for (UsedAndLeft row : usedAndLeftList) {
for (OperaEnum operaEnum : OperaEnum.values()) {
if (operaEnum == OperaEnum.PLUS) {
for (OperaEnum operaBetweenTwoDigits : OperaEnum.values()) {
if (operaBetweenTwoDigits == OperaEnum.PLUS) {
MiddleData middleDataObj = new MiddleData();
middleDataObj.usedExpr = "+(" + row.usedList.get(0) + "+" + row.usedList.get(1) + ")";
middleDataObj.unUsedDatas = new Integer[row.leftList.size()];
for (int i = 0; i < row.leftList.size(); i++) {
middleDataObj.unUsedDatas[i] = row.leftList.get(i);
}
middleDataObj.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE * 1.0 - (row.usedList.get(0) + row.usedList.get(1))));
lstMiddleData.add(middleDataObj);
} else if (operaBetweenTwoDigits == OperaEnum.MINUS) {
MiddleData middleDataObj = new MiddleData();
middleDataObj.usedExpr = "+(" + row.usedList.get(0) + "-" + row.usedList.get(1) + ")";
middleDataObj.unUsedDatas = new Integer[row.leftList.size()];
for (int i = 0; i < row.leftList.size(); i++) {
middleDataObj.unUsedDatas[i] = row.leftList.get(i);
}
middleDataObj.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE * 1.0 - (row.usedList.get(0) - row.usedList.get(1))));
lstMiddleData.add(middleDataObj);
MiddleData middleDataObj2 = new MiddleData();
middleDataObj2.usedExpr = "+(" + row.usedList.get(1) + "-" + row.usedList.get(0) + ")";
middleDataObj2.unUsedDatas = new Integer[row.leftList.size()];
for (int i = 0; i < row.leftList.size(); i++) {
middleDataObj2.unUsedDatas[i] = row.leftList.get(i);
}
middleDataObj2.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE * 1.0 - (row.usedList.get(1) - row.usedList.get(0))));
lstMiddleData.add(middleDataObj2);
} else if (operaBetweenTwoDigits == OperaEnum.MULTIPLY) {
MiddleData middleDataObj = new MiddleData();
middleDataObj.usedExpr = "+(" + row.usedList.get(0) + "*" + row.usedList.get(1) + ")";
middleDataObj.unUsedDatas = new Integer[row.leftList.size()];
for (int i = 0; i < row.leftList.size(); i++) {
middleDataObj.unUsedDatas[i] = row.leftList.get(i);
}
middleDataObj.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE * 1.0 - (row.usedList.get(0) * row.usedList.get(1))));
lstMiddleData.add(middleDataObj);
} else if (operaBetweenTwoDigits == OperaEnum.DIVIDE) {
MiddleData middleDataObj = new MiddleData();
middleDataObj.usedExpr = "+(" + row.usedList.get(0) + "/" + row.usedList.get(1) + ")";
middleDataObj.unUsedDatas = new Integer[row.leftList.size()];
for (int i = 0; i < row.leftList.size(); i++) {
middleDataObj.unUsedDatas[i] = row.leftList.get(i);
}
middleDataObj.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE * 1.0 - (row.usedList.get(0) * 1.0 / row.usedList.get(1))));
lstMiddleData.add(middleDataObj);
MiddleData middleDataObj2 = new MiddleData();
middleDataObj2.usedExpr = "+(" + row.usedList.get(1) + "/" + row.usedList.get(0) + ")";
middleDataObj2.unUsedDatas = new Integer[row.leftList.size()];
for (int i = 0; i < row.leftList.size(); i++) {
middleDataObj2.unUsedDatas[i] = row.leftList.get(i);
}
middleDataObj2.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE * 1.0 - (row.usedList.get(1) * 1.0 / row.usedList.get(0))));
lstMiddleData.add(middleDataObj2);
}
}
} else if (operaEnum == OperaEnum.MINUS) {
for (OperaEnum operaBetweenTwoDigits : OperaEnum.values()) {
if (operaBetweenTwoDigits == OperaEnum.PLUS) {
MiddleData middleDataObj = new MiddleData();
middleDataObj.usedExpr = "-(" + row.usedList.get(0) + "+" + row.usedList.get(1) + ")";
middleDataObj.unUsedDatas = new Integer[row.leftList.size()];
for (int i = 0; i < row.leftList.size(); i++) {
middleDataObj.unUsedDatas[i] = row.leftList.get(i);
}
middleDataObj.expectedValueForUnusedDatas = Double.parseDouble(decfmt.format(Point24.EXPECTED_VALUE * 1.0 + (row.usedList.get(0) + row.usedList.get(1))));
lstMiddleData.add(middleDataObj);
//考虑另外一种情况
MiddleData middleDataObj3 = new MiddleData();
middleDataObj3.usedExpr2 = "(" + row.usedList.get(0) + "+" + row.usedList.get(1) + ")-";
middleDataObj3.unUsedDatas = new Integer[row.leftList.size()];
for (int i = 0; i < row.leftList.size(); i++) {
middleDataObj3.unUsedDatas[i] = row.leftList.get(i);
}
middleDataObj3.expectedValueForUnusedDatas2 = Double.parseDouble(decfmt.format((row.usedList.get(0) +