# comparator 實作 前言: java server從DB取資料, 取出的List再回傳到client端時需要依照特定資料行的順序排序 該排序非以常見column desc asd可處理, 與其寫複雜的sql卡住db不如將排序工作放到java server中處理, 1. java server 比db容易水平擴展, 要卡db不如卡server 2. sql 維護不易.... JAVA List\<T\>提供sort方法 需實作comparator interface ```java= package cycle11_search_tree; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; public class compar_test { public static void main(String[] args) { List<Map<String, Object>> raw = new LinkedList<>(); Map<String, Object> x1 = new HashMap<>() { { put("key", "333"); } }; Map<String, Object> y1 = new HashMap<>() { { put("key", "222"); } }; Map<String, Object> z1 = new HashMap<>() { { put("key", "111"); } }; raw.add(y1); raw.add(x1); raw.add(z1); for (Map<String, Object> m : raw) { System.out.println(stringtify(m.get("key"))); } System.out.println("=========以上未排序=========="); // 依此順序進行排序 ArrayList<String> order = new ArrayList<>() { { add("333"); add("222"); add("111"); } }; System.out.print("排序順序:"); for (String s : order) { System.out.print(s + ","); } System.out.println(); // 建map 方便找比較順序 Map<String, Integer> priority = new HashMap<>(); for (int i = 0; i < order.size(); i++) { priority.put(order.get(i), i); } // non stream寫法 // Comparator<Map<String, Object>> spe = new Comparator<>() { // @Override // public int compare(Map<String, Object> o1, Map<String, Object> o2) { // // String a = stringtify(o1.get("key")); // Integer a_pri = priority.get(a); // // String b = stringtify(o2.get("key")); // Integer b_pri = priority.get(b); // // return a_pri - b_pri; // 小於0時交換順序 // } // }; // stream 寫法 Comparator<Map<String, Object>> spe1 = (o1, o2) -> { String a = stringtify(o1.get("key")); Integer a_pri = priority.get(a); String b = stringtify(o2.get("key")); Integer b_pri = priority.get(b); return a_pri - b_pri; // 小於0時交換順序 }; raw.sort(spe1); System.out.println("=========以下已排序=========="); for (Map<String, Object> m : raw) { System.out.println(stringtify(m.get("key"))); } // System.out.println(stringtify(null)); // null test } static private String stringtify(Object object) { return Optional.ofNullable(object) .map(Object::toString) .orElse(""); } } ``` ###### tags: `java` `comparator`