java 实现正交实验法(伪)

实现逻辑:
1、接受一个2维数组,按一维数组的长度进行排序
2、一维数组中长度最大的2个数组进行全量匹配,后续的数组根据匹配次数均匀匹配
3、匹配完成后,按之前传入的顺序 重新排序 匹配好的数组

public Object[][] Orthogonal(Object[][] data) {


    List<JSONArray> newData = new LinkedList<>();
    ArrayList<ArrayList<JSONObject>> arrayLists = new ArrayList<>();
    //将二维数组转化为链表 并加入step
    int num=0;
    for (Object[] datum : data) {
        JSONArray jsonArray = new JSONArray();
        for (int j = 0, size1 = datum.length; j < size1; j++) {
            jsonArray.put(j, new JSONObject()
                    .put("value", datum[j])
                    .put("num", num)
                    .put("step", 0));

        }
        num++;
        newData.add(jsonArray);
    }
    if (newData.size() < 2)
        throw new RuntimeException("二维数组长度必须>=2");
    //将linkedList按jsonarray 长度排序
    for (int i = 0, size = newData.size() - 1; i < size; i++) {

        for (int j = i + 1; j <= size; j++) {
            JSONArray jsonArray = newData.get(i);
            JSONArray jsonArray1 = newData.get(j);

            if (jsonArray.length() < jsonArray1.length()) {
                newData.set(i, jsonArray1);
                newData.set(j, jsonArray);
            }
        }
    }
    JSONArray jsonArray = newData.get(0);
    JSONArray jsonArray1 = newData.get(1);

    newData.remove(0);
    newData.remove(0);

    for (int i = 0, size = jsonArray.length(); i < size; i++) {

        for (int k = 0, s = jsonArray1.length(); k < s; k++) {

            ArrayList<JSONObject> arrayList = new ArrayList<>();
            arrayList.add(jsonArray.optJSONObject(i));

            arrayList.add(minValue(jsonArray1));

            if (!newData.isEmpty())
                newData.forEach(array -> arrayList.add(minValue(array)));

            arrayLists.add(arrayList);
        }

    }

    Object[][] objects=new Object[arrayLists.size()][arrayLists.get(0).size()];
    for (int i=0,size=arrayLists.size();i<size;i++){

        JSONArray arr=new JSONArray(arrayLists.get(i));
        //按最开始的数组顺序组合二维数组
        for (int k=0,sizes=arr.length();k<sizes;k++){
            objects[i][k]=new GetJsonValue().getValue(new GetJsonValue()
                    .getJSONObjectOfKV(arr.toString(),"num",k+""),"value");
        }
    }
    return  objects;
}

private JSONObject minValue(JSONArray jsonArray) {
    for (int i = 1, size = jsonArray.length(); i < size; i++) {
        JSONObject jsonObject = jsonArray.optJSONObject(0);
        JSONObject jsonObject1 = jsonArray.getJSONObject(i);


        if (jsonObject.getInt("step") >= jsonObject1.getInt("step")) {
            jsonArray.put(0, jsonObject1);
            jsonArray.put(i, jsonObject);
        }
    }
    return jsonArray.getJSONObject(0);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值