package com.huixinpn.dionysus.domain.psychtest.eval;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.Data;
public class PF16Normalization {
// 高中男生十六种个性因素常模
public static final String[] HIGH_SCHOOL_BOY = new String[]{
// "因素 1 2 3 4 5 6 7 8 9 10 因素 X S ",
"A 0-1 2 3-4 5-6 7-9 10-11 12-13 14-16 17-18 19-20 A 9.02 3.50",
"B 0-4 5 6 7 8 9 10 11 12 13 B 8.13 1.86",
"C 0-5 6-7 8-10 11-12 13-15 16-17 18-19 20-22 23-24 25-26 C 14.91 3.65",
"E 0-2 3-4 5-7 8-9 10-11 12-24 15-16 17-18 19-20 21-26 E 11.41 3.43",
"F 0-2 3-4 5-7 8-9 10-12 13-15 16-17 18-19 20-22 23-26 F 12.45 3.92",
"G 0-4 5-6 7-8 9-10 11-13 14-15 16-17 18 19 20 G 12.95 3.08",
"H 0-1 2 3-5 6-8 9-10 11-13 14-15 16-18 19-20 21-26 H 10.68 3.94",
"I 0-2 3-4 5-6 7-8 9-10 11-12 13-14 15-16 17-19 20 I 10.42 3.21",
"L 0-4 4-6 7-8 6-10 11 12-13 14-15 16-17 18 19-20 L 11.82 2.60",
"M 0-3 5-6 7-8 9-10 11-12 13-14 15-17 18-19 20-21 22-26 M 12.66 3.33",
"N 0-2 3 4-5 6 7-8 9-10 11 12-13 14-15 16-20 N 8.40 2.50",
"O 0-1 2-3 4-5 6-8 9-10 11-13 14-16 17-19 20-21 22-26 O 11.10 3.95",
"Q1 0-3 4-5 6-7 8-9 10-11 12-13 14-15 16-17 18-19 20 Q1 11.73 2.92",
"Q2 0-3 4-5 6-7 8-10 11-12 13-14 15-16 17-18 19 20 Q2 12.25 3.30",
"Q3 0-4 5-6 7-8 9-10 11-12 13-14 15-16 17-18 19 20 Q3 12.34 3.13",
"Q4 0-1 2-4 5-6 7-9 10-11 12-14 15-16 17-19 20-22 23-26 Q4 11.67 3.88"
};
// 高中女生十六种个性因素常模
public static final String[] HIGH_SCHOOL_GIRL = new String[] {
// "因素 1 2 3 4 5 6 7 8 9 10 因素 X S ",
"A 0-1 2 3-5 6-7 8-9 10-12 13-14 15-16 17-19 20 A 9.78 3.58",
"B 0-3 4-5 6 7 8 9 10 11 12 13 B 8.78 1.88",
"C 0-5 6-7 8-10 11-12 13-14 15-17 18-19 20-21 22-23 24-26 C 14.69 3.44",
"E 0-1 2-3 4-6 7-8 9-10 11-12 13-15 16-17 18-19 20-26 E 10.67 3.39",
"F 0-3 4-5 6-7 8-10 11-12 13-15 16-18 19-20 21-23 24-26 F 12.82 3.81",
"G 0-4 5-6 7-8 9-10 11-13 14-15 16-17 18 19 20 G 13.07 3.28",
"H 0-1 2-3 4-5 6-7 8-10 11-13 14-15 16-17 18-20 21-26 H 10.23 3.82",
"I 0-3 4-5 6-7 8-9 10-11 12 13-14 15-16 17-18 19-20 I 11.03 2.78",
"L 0-4 5-6 7 8-9 10-11 12-13 14-15 16-17 18 19-20 L 11.55 2.73",
"M 0-5 6-7 8-9 10-11 12-13 14-15 16-18 19-20 21-22 23-26 M 13.80 3.13",
"N 0-2 3 4-5 6-7 8-9 10 11-12 12 14-15 16-20 N 6.89 2.48",
"O 0-1 2-4 5-6 7-8 9-11 12-13 14-16 17-18 19-21 22-26 O 11.35 3.69",
"Q1 0-5 6 7-8 9-10 11-12 13-14 15 16-17 18-19 20 Q1 12.19 2.68",
"Q2 0-3 4-5 6-7 8-9 10-12 13-14 15-16 17-18 19 20 Q2 12.05 3.40",
"Q3 0-4 5-6 7-8 9-10 11-12 13-14 15-16 17-18 19 20 Q3 12.89 3.01",
"Q4 0-1 2-3 4-5 6-8 9-10 11-13 14-15 16-18 19-20 21-26 Q4 10.77 3.80"
};
// 大学男生十六种个性因素常模
public static final String[] COLLEGE_BOY = new String[] {
// "因素 1 2 3 4 5 6 7 8 9 10 因素 X S ",
"A 0-1 2 3-4 5-6 7-8 9-11 12-13 14-15 16-18 19-20 A 8.87 3.46",
"B 0-3 4 5 6 7 8 9 10 11 12-13 B 8.17 1.79",
"C 0-5 6-7 8-10 11-12 13-14 15-16 17-18 19-21 22-23 24-26 C 14.41 3.33",
"E 0-2 3-4 5-7 8-9 10-11 12-13 14-16 17-18 19-20 21-26 E 11.41 3.55",
"F 0-2 3-4 5-7 8-10 11-12 13-15 16-17 18-20 21-23 24-26 F 12.60 3.94",
"G 0-4 5-6 7-8 9-10 11-12 13-14 15-16 17-18 19 20 G 12.60 3.09",
"H 0-1 2-3 4-5 6-7 8-10 11-13 14-16 17-18 19-21 22-26 H 10.56 4.01",
"I 0-3 4 5-6 7-8 9-10 11-12 13-14 15-16 17-18 19-20 I 10.49 2.80",
"L 0-4 5-6 7-8 9-10 11-12 13 14-15 16-17 18-19 20 L 11.82 2.69",
"M 0-3 4-6 7-8 9-10 11-12 13-14 15-16 17-19 20-21 22-26 M 12.51 3.32",
"N 0-1 2-3 4-5 6-7 8 9-10 11-12 13-14 15-16 17-20 N 8.82 2.76",
"O 0-1 2-3 4-6 7-8 9-10 11-13 14-15 16-17 18-20 21-26 O 10.64 3.61",
"Q1 0-4 5-6 7-8 9 10-11 12-13 14-15 16-17 18-19 20 Q1 11.84 2.84",
"Q2 0-4 5-6 7-8 9-10 11-13 14-15 16-17 18 19 20 Q2 12.86 3.19",
"Q3 0-4 5-6 7-8 9-10 11-12 13-14 15-16 17-18 19 20 Q3 12.30 1.10",
"Q4 0-1 2-3 4-5 6-8 9-11 12-13 14-16 17-18 19-21 22-26 Q4 11.12 3.90"
};
// 大学女生十六种个性因素常模
public static final String[] COLLEGE_GIRL = new String[] {
// "因素 1 2 3 4 5 6 7 8 9 10 因素 X S ",
"A 0-1 2 3-4 5-7 8-9 10-11 12-14 15-16 17-19 20 A 9.54 3.60",
"B 0-4 5 6 7 8 9 10 11 12 13 B 8.46 1.77",
"C 0-5 6-7 8-9 10-11 12-14 15-16 17-19 20-21 22-23 24-26 C 14.52 3.44",
"E 0-1 2-8 4-5 6-8 9-10 11-12 13-15 16-17 18-19 20-26 E 10.42 3.51",
"F 0-3 4-5 6-7 8-9 10-12 13-15 16-17 18-19 20-22 23-26 F 12.56 3.66",
"G 0-4 5-6 7-8 9-10 11-12 13-14 15-16 17-18 19 20 G 12.35 2.99",
"H 0-1 2-3 4-5 6-7 8-10 11-13 14-15 16-17 18-20 21-26 H 10.18 3.80",
"I 0-4 5-6 7-8 9-10 11-12 13 14-15 16-17 18-19 20 I 11.97 2.80",
"L 0-5 6 7-8 9-10 11 12-13 14-15 16-17 18 19-20 L 11.87 2.55",
"M 0-4 5-6 7-9 10-11 12-14 15-16 17-18 19-21 22-23 24-26 M 14.00 3.58",
"N 0-2 3-4 5 6-7 8-9 10 11-12 13 14-15 16-20 N 9.05 2.40",
"O 0-2 3-4 5-6 7-9 10-11 12-14 15-16 17-18 19-21 22-26 O 11.70 3.60",
"Q1 0-4 5-6 7-8 9-10 11-12 13-14 15 16-17 18-19 20 Q1 11.66 2.84",
"Q2 0-4 5-6 7-8 9-10 11-12 13-15 16-17 18 19 20 Q2 12.80 3.26",
"Q3 0-4 5-6 7-8 9-11 12-13 14-15 16-17 18 19 20 Q3 13.10 3.27",
"Q4 0-1 2-3 4-5 6-8 9-11 12-14 15-16 17-19 20-21 22-26 Q4 11.21 4.01"
};
// 成人(男)十六种个性因素常模
public static final String[] ADULT_MALE = new String[] {
// "因素 1 2 3 4 5 6 7 8 9 10 因素 X S ",
"A 0-1 2-3 4-5 6-7 8-9 10-11 12-13 14-16 17-18 19-20 A 9.63 3.17",
"B 0-2 3 4-5 6 7-8 9 10 11 12 13 B 7.98 2.05",
"C 0-6 7-8 9-10 11-13 14-15 16-17 18-19 20-21 22-23 24-26 C 15.16 3.27",
"E 0-1 2-4 5-6 7-8 9-11 12-13 14-15 16-18 19-20 21-26 E 11.18 3.56",
"F 0-1 2-3 4-5 6-8 9-10 11-13 14-15 16-18 19-20 21-26 F 10.74 3.77",
"G 0-4 5-6 7-8 9-11 12-13 14-15 16-17 18 19 20 G 13.25 3.23",
"H 0-1 2-3 4-5 6-7 8-10 11-12 13-14 15-17 18-19 20-26 H 9.95 3.71",
"I 0-3 4-5 6-7 8-9 10-11 12-13 14 15-16 17-18 19-20 I 11.11 2.80",
"L 0-4 5-6 7 8-9 10-11 12 13-14 15 16-17 18-20 L 11.12 2.39",
"M 0-4 5-6 7-8 9-10 11-12 13-14 15 16-17 18-19 20-26 M 12.62 3.25",
"N 0-2 3 4-5 6-7 8 9-10 11-12 13 14-15 16-20 N 8.71 2.56",
"O 0-1 2-4 5-6 7-8 9-11 12-13 14-15 16-18 19-20 21-26 O 11.03 3.54",
"Q1 0-4 5 6-7 8-9 10-11 12-13 14-15 16-17 18-19 20 Q1 11.78 2.92",
"Q2 0-4 5-6 7-8 9-10 11-12 13-15 16-17 18 19 20 Q2 12.75 3.30",
"Q3 0-4 5-6 7-8 9-10 11-12 13-14 15-16 17-18 19 20 Q3 12.70 3.04",
"Q4 0-1 2-3 4-5 6-8 9-10 11-13 14-15 16-18 19-20 21-26 Q4 10.83 3.69"
};
// 成人(女)十六种个性因素常模
public static final String[] ADULT_FEMALE = new String[] {
// "因素 1 2 3 4 5 6 7 8 9 10 因素 X S ",
"A 0-1 2-3 4-5 6-7 8-10 11-12 13-14 15-16 17-18 19-20 A 10.10 3.29",
"B 0-3 4 5-6 7 8 9 10 11 12 13 B 8.69 1.94",
"C 0-5 6-8 9-10 11-12 13-14 15-17 18-19 20-21 22-23 24-26 C 14.76 3.39",
"E 0-1 2-3 4-5 6-7 8-9 10-12 13-14 15-16 17-18 19-26 E 9.92 3.12",
"F 0-1 2-3 4-5 6-7 8-10 11-13 14-15 16-18 19-20 21-26 F 10.42 3.36",
"G 0-5 6-7 8-9 10-12 13-14 15-16 17 18 19 20 G 13.91 3.16",
"H 0-1 2 3-4 5-6 7-8 9-11 12-13 14-15 16-18 19-26 H 8.85 3.53",
"I 0-4 5-6 7-8 9-10 11 12-13 14-15 16-17 18 19-20 I 11.81 2.58",
"L 0-3 4-5 6-7 8-9 10 11-12 13-14 15-16 17-18 19-20 L 10.82 2.68",
"M 0-3 4-6 7-8 9-10 11-13 14-15 16-17 18-19 20-22 23-26 M 12.97 3.39",
"N 0-2 3-4 5-6 7 8-9 10-11 12 13-14 15 16-20 N 9.25 2.45",
"O 0-3 4-5 6-7 8-10 11-12 13-14 15-16 17-19 20-21 22-26 O 12.35 3.42",
"Q1 0-3 4-5 6-7 8-9 10-11 12-13 14-15 16-17 18-19 20 Q1 11.27 2.97",
"Q2 0-3 4-5 6-7 8-9 10-12 13-14 15-16 17-18 19 20 Q2 11.98 3.15",
"Q3 0-5 6-7 8-9 10-11 12-13 14-15 16-17 18 19 20 Q3 13.05 2.94",
"Q4 0-1 2-3 4-6 7-9 10-12 13-14 15-17 18-19 20-22 23-26 Q4 11.70 3.97"
};
@Data
static class Range {
private int start;
private int end;
private int normalized;
public Range(String value, int normalized) {
String[] points = value.split("-");
if (points.length == 1) {
int point = Integer.parseInt(points[0]);
this.start = this.end = point;
} else {
this.start = Integer.parseInt(points[0]);
this.end = Integer.parseInt(points[1]);
}
this.normalized = normalized;
}
public boolean accept(int score) {
return start <= score && score <= end;
}
}
public static Map<String, List<Range>> createNormalizeMap(String[] table) {
Map<String, List<Range>> map = new HashMap<String, List<Range>>();
for (String line : table) {
String[] row = line.split("\\s+");
String factor = row[0];
List<Range> ranges = new ArrayList<Range>();
for (int i = 1; i <= 10; i++) {
ranges.add(new Range(row[i], i));
}
map.put(factor, ranges);
}
return map;
}
public static int normalizeScore(Collection<Range> ranges, int score, String factor) {
for (Range range : ranges) {
if (range.accept(score)) {
return range.getNormalized();
}
}
throw new RuntimeException("cannot find normalized value for factor: " + factor + ", score: " + score);
}
public static Map<String, Integer> normalize(Map<String, Integer> raw, String[] table) {
Map<String, List<Range>> normalizeMap = createNormalizeMap(table);
Map<String, Integer> results = new HashMap<String, Integer>();
for (Map.Entry<String, Integer> entry : raw.entrySet()) {
String factor = entry.getKey();
List<Range> ranges = normalizeMap.get(factor);
int score = normalizeScore(ranges, entry.getValue(), factor);
results.put(factor, score);
}
return results;
}
}