|
@@ -20,6 +20,8 @@ import java.time.LocalDateTime;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
+import java.util.function.Function;
|
|
|
|
+import java.util.function.Supplier;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
import java.util.regex.Pattern;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
@@ -1204,18 +1206,31 @@ public class CustomFunction {
|
|
/*多个设计值*/
|
|
/*多个设计值*/
|
|
String[] designArr = designs.toString().split("/");
|
|
String[] designArr = designs.toString().split("/");
|
|
String[] devArr = dev.toString().split("/");
|
|
String[] devArr = dev.toString().split("/");
|
|
- int total = 0;
|
|
|
|
- int pass = 0;
|
|
|
|
- List<List<Object>> dl = dataSpaceSplit(data, designArr);
|
|
|
|
- for (int i = 0; i < designArr.length; i++) {
|
|
|
|
- Object[] obs = ck(dl.size() > i ? dl.get(i) : dl.get(dl.size() - 1), designArr[i], devArr.length > i ? devArr[i] : devArr[devArr.length - 1], xN);
|
|
|
|
- total += StringUtils.handleObj2Integer(obs[0]);
|
|
|
|
- pass += StringUtils.handleObj2Integer(obs[1]);
|
|
|
|
- }
|
|
|
|
- if (total > 0) {
|
|
|
|
|
|
+ AtomicInteger total = new AtomicInteger();
|
|
|
|
+ AtomicInteger pass = new AtomicInteger();
|
|
|
|
+ List<List<Object>> dl = dataSpaceSplit(data);
|
|
|
|
+ if(dl.size()==designArr.length){
|
|
|
|
+ for (int i = 0; i < designArr.length; i++) {
|
|
|
|
+ Object[] obs = ck(dl.size() > i ? dl.get(i) : dl.get(dl.size() - 1), designArr[i], devArr.length > i ? devArr[i] : devArr[devArr.length - 1], xN);
|
|
|
|
+ total.addAndGet(StringUtils.handleObj2Integer(obs[0]));
|
|
|
|
+ pass.addAndGet(StringUtils.handleObj2Integer(obs[1]));
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ data.stream().map(d -> Arrays.stream(designArr).filter(StringUtils::isNotEmpty).map(e -> CustomFunction.dXd(e, d,1,3)).reduce(Double.MAX_VALUE, (p, n) -> offRangeSum(p) < offRangeSum(n) ? p : n)).collect(Collectors.toCollection((Supplier<ArrayList<Object>>) ArrayList::new));
|
|
|
|
+ List<Object> designList=Arrays.asList(designArr);
|
|
|
|
+ Function<Object,Object> fc=d-> designList.stream().reduce(Double.MAX_VALUE, (p, n) -> offRangeSum(CustomFunction.dXd(p, d,1,3)) < offRangeSum(CustomFunction.dXd(n, d,1,3)) ? p : n);
|
|
|
|
+ Map<Integer,List<Object>> group=data.stream().filter(StringUtils::isNotEmpty).collect(Collectors.groupingBy(x->designList.indexOf(fc.apply(x))));
|
|
|
|
+ Object finalXN = xN;
|
|
|
|
+ group.forEach((k, v)->{
|
|
|
|
+ Object[] obs = ck(v, designArr[k], devArr.length > k ? devArr[k] : devArr[devArr.length - 1], finalXN);
|
|
|
|
+ total.addAndGet(StringUtils.handleObj2Integer(obs[0]));
|
|
|
|
+ pass.addAndGet(StringUtils.handleObj2Integer(obs[1]));
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ if (total.get() > 0) {
|
|
result.add(total);
|
|
result.add(total);
|
|
result.add(pass);
|
|
result.add(pass);
|
|
- result.add(total - pass);
|
|
|
|
|
|
+ result.add(total.get() - pass.get());
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
Object[] target = ck(data, designs, dev, xN);
|
|
Object[] target = ck(data, designs, dev, xN);
|
|
@@ -1239,6 +1254,13 @@ public class CustomFunction {
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ /* public static void main(String[] args) {
|
|
|
|
+ List<Object> list = Arrays.asList(21967,20853);
|
|
|
|
+ b445check(list,"21966/20849","±3",1).forEach(System.out::println);
|
|
|
|
+ }*/
|
|
|
|
+
|
|
|
|
+
|
|
public static Object designFormat(Object design) {
|
|
public static Object designFormat(Object design) {
|
|
if (StringUtils.isNotEmpty(design)) {
|
|
if (StringUtils.isNotEmpty(design)) {
|
|
return Arrays.stream(design.toString().split("[^\\d.]")).filter(StringUtils::isNotEmpty).collect(Collectors.joining("/"));
|
|
return Arrays.stream(design.toString().split("[^\\d.]")).filter(StringUtils::isNotEmpty).collect(Collectors.joining("/"));
|
|
@@ -1246,27 +1268,53 @@ public class CustomFunction {
|
|
return "";
|
|
return "";
|
|
}
|
|
}
|
|
|
|
|
|
- public static List<List<Object>> dataSpaceSplit(List<Object> data, String[] designArr) {
|
|
|
|
|
|
+
|
|
|
|
+ public static double offRangeSum(Object o){
|
|
|
|
+ if(o.equals(Double.MAX_VALUE)){
|
|
|
|
+ return Double.MAX_VALUE;
|
|
|
|
+ }
|
|
|
|
+ return Arrays.stream(o.toString().split("[^0-9.\\-]")).mapToDouble(e->Math.pow(Double.parseDouble(e),2)).sum();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public static List<List<Object>> dataSpaceSplit(List<Object> data) {
|
|
List<List<Object>> result = new ArrayList<>();
|
|
List<List<Object>> result = new ArrayList<>();
|
|
- if (ListUtils.isNotEmpty(data) && designArr != null) {
|
|
|
|
- /*首尾去空*/
|
|
|
|
- data = listTrim(data);
|
|
|
|
- String tmp = data.stream().map(StringUtils::handleNull).collect(Collectors.joining(","));
|
|
|
|
- tmp = tmp.replaceAll(",,,+", ",,");
|
|
|
|
- List<List<Object>> preliminary = Arrays.stream(tmp.split(",,")).map(CustomFunction::obj2ListNe).collect(Collectors.toList());
|
|
|
|
- /*默认容量16,小于12不会自动扩容*/
|
|
|
|
- LinkedHashMap<Integer, List<Object>> classify = new LinkedHashMap<>();
|
|
|
|
- for (int i = 0; i < preliminary.size(); i++) {
|
|
|
|
- int key = i % designArr.length;
|
|
|
|
- classify.merge(key, preliminary.get(i), (v1, v2) -> {
|
|
|
|
- v1.addAll(v2);
|
|
|
|
- return v1;
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- result = new ArrayList<>(classify.values());
|
|
|
|
|
|
+ if (ListUtils.isNotEmpty(data)) {
|
|
|
|
+ List<Double> list= data.stream().filter(StringUtils::isNumber).map(x->Double.parseDouble(x.toString())).collect(Collectors.toList());
|
|
|
|
+ List<List<Double>> target=segmentList(list);
|
|
|
|
+ result=target.stream().map(l->l.stream().collect(Collectors.toCollection((Supplier<ArrayList<Object>>) ArrayList::new))).collect(Collectors.toList());
|
|
}
|
|
}
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
+ static List<List<Double>> segmentList(List<Double> inputList) {
|
|
|
|
+ List<List<Double>> segments = new ArrayList<>();
|
|
|
|
+ List<Double> currentSegment = new ArrayList<>();
|
|
|
|
+ inputList.forEach(number -> {
|
|
|
|
+ if (currentSegment.isEmpty() || shouldSplit(currentSegment, number)) {
|
|
|
|
+ if (!currentSegment.isEmpty()) {
|
|
|
|
+ segments.add(new ArrayList<>(currentSegment));
|
|
|
|
+ }
|
|
|
|
+ currentSegment.clear();
|
|
|
|
+ }
|
|
|
|
+ currentSegment.add(number);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ if (!currentSegment.isEmpty()) {
|
|
|
|
+ segments.add(new ArrayList<>(currentSegment));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return segments;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ static boolean shouldSplit(List<Double> segment, double number) {
|
|
|
|
+ if (segment.isEmpty()) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ double lastNumber = segment.get(segment.size() - 1);
|
|
|
|
+ double difference = Math.abs((number - lastNumber) / lastNumber);
|
|
|
|
+ return difference > 0.2 || difference > ((double) 50 / 100.0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
public static List<Object> listTrim(List<Object> list) {
|
|
public static List<Object> listTrim(List<Object> list) {
|
|
List<Object> result = new ArrayList<>();
|
|
List<Object> result = new ArrayList<>();
|
|
@@ -2629,11 +2677,11 @@ public class CustomFunction {
|
|
if (StringUtils.isEmpty(scale)) {
|
|
if (StringUtils.isEmpty(scale)) {
|
|
scale = 0;
|
|
scale = 0;
|
|
}
|
|
}
|
|
- String delimiter = handleNull(matcherFindGroup("[^0-9./]", design.toString(), 0, false));
|
|
|
|
|
|
+ String delimiter = handleNull(matcherFindGroup("[^0-9./E]", design.toString(), 0, false));
|
|
if (StringUtils.isEmpty(delimiter)) {
|
|
if (StringUtils.isEmpty(delimiter)) {
|
|
delimiter = CONCAT;
|
|
delimiter = CONCAT;
|
|
}
|
|
}
|
|
- String delimiter2 = handleNull(matcherFindGroup("[^0-9.]", design.toString(), 0, false));
|
|
|
|
|
|
+ String delimiter2 = handleNull(matcherFindGroup("[^0-9.E]", data.toString(), 0, false));
|
|
if (StringUtils.isEmpty(delimiter2)) {
|
|
if (StringUtils.isEmpty(delimiter2)) {
|
|
delimiter2 = CONCAT;
|
|
delimiter2 = CONCAT;
|
|
}
|
|
}
|