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; } }