ã¯ããã« ããã«ã¡ã¯ãHiropyã§ãã ä»åã¯ã Java ã®Comparatorã«ã€ããŠç°¡åã«è§£èª¬ã§ããã°ãšæããŸãã ã¯ããã« Comparatorãšã¯? compareã¡ãœããã®äœ¿ç𿹿³ 䜿çšäŸ Comparableãšã®éã äž»ãªã¡ãœãã comparing reversed naturalOrderã»reverseOrder nullsFirstã»nullsLast thenComparing ãŸãšã Comparatorãšã¯? Comparator ã¯ããæ¯èŒè
ããšããåèš³ã®éã ãªããžã§ã¯ãåå£«ã®æ¯èŒ ãè¡ãã€ã³ã¿ãã§ãŒã¹ã§ãäž»ã«Listçã® ãœãŒã (䞊ã¹ãã)ã«äœ¿ãããŸãã åãã©ã¡ãŒã¿Tãæã€ 颿°åã€ã³ã¿ãã§ãŒã¹ ã§ãæœè±¡ã¡ãœããã® compare (T o1, T o2)ãå®è£
ããããšã§å€§å°æ¯èŒãã§ããããã«ãªããŸãã åŸè¿°ããéã䟿å©ãªã¡ãœãããè€æ°ãããæ¯åcompareãå®è£
ããå¿
èŠããªãããšããã€ã³ãã§ãã â»ãã®èšäºã«ã¯é¢æ°åã€ã³ã¿ãã§ãŒã¹ã ã©ã ãåŒ ãç¹ã«èª¬æãªãç»å ŽããŸããããããããªãæ¹ã¯ãŸããã¡ããã調ã¹ãŠã¿ãŠãã ããã compareã¡ãœããã®äœ¿ç𿹿³ compare (T o1, T o2)ã¯ã o1ãå°ãã(ãœãŒããããšãå
ã«äžŠã¶)ãšãã¯è¿ãå€ãè² ã«ão1ã倧ãã(åŸã«äžŠã¶)ãšãã¯æ£ã«ãçãããšãã¯0 ã«ãªãããã«å®è£
ããŸãã äŸãã°ãStringåãæåæ°ã§æ¯èŒ(çãã»ãããå°ããããšå€å®)ãããå Žåãå®è£
ã¯ä»¥äžã®ããã«ãªããŸãã // s1ã®ã»ããçããšãã¯s1.length() < s2.length()ãªã®ã§è² ã®å€ãè¿ããs1ã®ã»ããé·ããšãã¯ãã®éã§æ£ãè¿ã Comparator<String> stringComparator = (String s1, String s2) -> s1.length() - s2.length(); ããè€éãªå®è£
ãå¯èœã§ãã 以äžã®Comparator ã¯ãheightãå°ããã»ãããå°ããããšå€å®ããheightãåãå Žåã¯ãweightã倧ããæ¹ããå°ããããšå€å®ããäžé¢šå€ãã£ããã®ã§ãã class Person { public int height; public int weight; } Comparator<Person> personComparator = (p1, p2) -> { if (p1.height != p2.height) { return p1.height - p2.height; } return p2.weight - p1.weight; }; 䜿çšäŸ é
åããªã¹ãã«ã¯ãComparatorãçšãããœãŒããè¡ãã¡ãœãããçšæãããŠããŸãã 以äžã«ä»£è¡šçãªãã®ãæããŸãããåºæ¬çã«ãœãŒãåŸã®äžŠã³ã¯ æé (å°ããé )ã§ãã (ç¡è«ãœãŒãã¡ãœããã®å®è£
次第ã§äžŠã³é ãéé ããã®ä»ã®é ã«ãªã£ãŠãããã®ãååšãåŸãŸã) 以äžã®äŸã§ã¯ãå
çšã®stringComparatorãçšããŠList ãæåæ°ã®æé ã§äžŠã¹æ¿ããŠããŸãã Comparator<String> stringComparator = (String s1, String s2) -> s1.length() - s2.length(); List<String> wordList = new ArrayList<>(Arrays.asList( "Today" , "is" , "a" , "good" , "day" )); System.out.println(wordList); // >[Today, is, a, good, day] // stream().sortedã¯å
ã®ãªã¹ãã倿Žããã«æ°ããã¹ããªãŒã ãè¿ã List<String> sortedList = wordList.stream().sorted(stringComparator).toList(); System.out.println(sortedList); // >[a, is, day, good, Today] // List.sortã¯å
ã®ãªã¹ãã倿Žãã wordList.sort(stringComparator); System.out.println(wordList); // >[a, is, day, good, Today] List<String> wordList2 = new ArrayList<>(Arrays.asList( "This" , "is" , "a" , "pen" )); // Collections.sortãå
ã®ãªã¹ãã倿Žãã Collections.sort(wordList2, stringComparator); System.out.println(wordList2); // >[a, is, pen, This] ãã¡ããã1åãã䜿ããªããšãã¯ãã¡ãã¡Comparator倿°ãå®çŸ©ããªããŠããœãŒããã颿°ã®åŒæ°å
ã«èšè¿°ããã°OKã§ãã List<String> wordList = new ArrayList<>(Arrays.asList( "Today" , "is" , "a" , "good" , "day" )); List<String> sortedList = wordList.stream().sorted((String s1, String s2) -> s1.length() - s2.length()).toList(); // >[a, is, day, good, Today] Comparableãšã®éã ComparatorãšäŒŒãååã®æ¯èŒçšã€ã³ã¿ãã§ãŒã¹ãšããŠã Comparable ãååšããŸãã Comparableãåãã©ã¡ãŒã¿Tãæã€é¢æ°åã€ã³ã¿ãã§ãŒã¹ã§ãå®è£
æã«ã¯ compareTo (T o)ãå®è£
ããå¿
èŠããããŸãã ãã®compareToã¯ã¯ã©ã¹å
èµã®Comparatorã®ãããªãã®ã§ã ã€ã³ã¹ã¿ã³ã¹ ã®æ¯èŒããããã¯ã©ã¹ã§ãããããæ¯èŒæ¹æ³ãå®è£
ããŠãããã®ã§ãã Comparableãå®è£
ãããªããžã§ã¯ãããœãŒããããšãã«ã¡ãœãããåŒæ°ãªããåŒæ°nullã§åŒã³åºããšãã¡ãœããã«ããããŸããcompareToã䜿çšããæé ãœãŒãããªãããããšãå€ãã§ãã ãªããcompareToã®æ¯èŒã«ããé åºä»ãã®ããšã èªç¶é åºä»ã ãšãããŸãã class Person implements Comparable<Person>{ public int age; public Person( int age) { this .age = age; } @Override // thisãå°ãããšãã¯è² ã®æ°ããthisã倧ãããšãã¯æ£ã®æ°ããåããšãã¯0ãè¿ãããå®è£
public int compareTo(Person p) { return this .age - p.age; } } List<Person> people = new ArrayList<>(Arrays.asList( new Person( 10 ), new Person( 30 ), new Person( 20 ))); // stream.sortedã§ã¯åŒæ°ãªãã§åŒã³åºã List<Person> sortedPeople = people.stream().sorted().toList(); // List.sortã§ã¯åŒæ°nullã§åŒã³åºã people.sort( null ); // ãããã[10, 20, 30] Comparable㯠ã¯ã©ã¹å
ã§äžåºŠå®è£
ããã°æ¯åãœãŒãã®éã®æ¯èŒæ¹æ³ãæžããªããŠãã ãšããã¡ãªããããããŸãã äžæ¹ã§Comparatorã¯ãœãŒãæã«æ¯åå®è£
ããã®ã§ã åãã¯ã©ã¹ã§ããã®å Žã«åãããè²ã
ãªåºæºã§ãœãŒãã§ãã ãœãŒãããå Žæã«æ¯èŒæ¹æ³ãæžãã®ã§ãããšèŠãŠäœã§ãœãŒãããã®ããããããã ãšãã£ãç¹ãã¡ãªããã§ãã äž¡æ¹äœ¿çšããŠããComparableãå®è£
ããŠãããŠæ®æ®µã¯èªç¶é åºä»ããç¹å¥ãªäžŠã¹ããæ¹æ³ã䜿ããããšãã¯Comparatorããšãã£ãéçšæ¹æ³ãå¯èœã§ãã ã¡ãªã¿ã«ã JDK ã«å«ãŸããŠããã¡ãžã£ãŒãªã¯ã©ã¹ã«ããComparableãå®è£
ããŠããã¯ã©ã¹ã¯ä»¥äžã®ããã«è€æ°ååšããŸãã IntegerãDouble, BigDecimal ãªã©æ°å€ç³»ã¯ãæ°å€ã®æé ã«äžŠã¶ Stringã¯ãèŸæžé ã®æé ã«äžŠã¶ LocalDateTimeãªã©ã®æ¥ä»æå»ç³»ã¯ãæ¥ä»æå»ã®æé ã«äžŠã¶ äž»ãªã¡ãœãã åè¿°ã®éãComparatorã«ã¯compare以å€ã«ãstaticã»defaultã¡ãœãããããã€ãçšæãããŠããŸãã ãããã䜿çšããããšã§ãããçããèŠãããã³ãŒãã§æ¯èŒã»ãœãŒããè¡ããŸãã comparing Comparator. comparing (Function keyExtractor)ã§ã¯ãåŒæ°ã«ãComparatorãå®è£
ãããªããžã§ã¯ããè¿ãã¡ãœããããå®è£
ããFunctionãå
¥ããããšã§ããã®ã¡ãœããã®è¿ãå€ãèªç¶é åºä»ãã§æ¯èŒããComparatorãè¿ãããŸãã ãªããžã§ã¯ãã®æ¯èŒã¯ãæ°å€å(Integer, Doubleãªã©)ã®å€æ°ãlengthãªã©äœããã® æ°å€ ã䜿ã£ãŠè¡ãããšãå€ãããšæããŸããã ãã®écompareãå®è£
ããŠComparatorãäœãå Žåã¯åãã¡ãœããã®åŒã³åºãã2åæžãããšã«ãªãã»ãããã©ã£ã¡ããã©ã£ã¡ãåŒããšæé ã ã£ã?ããšè¿·ãããšãå°ãªããããŸããã comparingã䜿çšãããšã¡ãœããã1åæžãã ãã§æžãã®ã§ãã³ãŒãã£ã³ã°ãã¹ãæžããããšãå¯èœã§ãã Comparator<String> stringComparator = Comparator.comparing(s -> s.length()); // Comparator<String> stringComparator = (String s1, String s2) -> s1.length() - s2.length(); ãšåã // ã¡ãœããåç
§ã䜿çšãããšããç°¡æœã«æžãã Comparator<String> stringComparator2 =Comparator.comparing(String::length); æ°å€åã«éãããäŸãã°Stringãè¿ãã¡ãœãããå
¥ããå ŽåãèŸæžé ã§æ¯èŒããComparatorã«ãªããŸãã class Person { public String name; public Person(String name) { this .name = name; } public String getName() { return name; } } List<Person> people = new ArrayList<>(Arrays.asList( new Person( "Hinata" ), new Person( "Emily" ), new Person( "Tsubasa" ))); List<Person> sortedList = people.stream().sorted(Comparator.comparing(Person::getName)).toList(); // > [Emily, Hinata, Tsubasa] ãŸããåŒæ°ã2ã€åãcomparing(Function keyExtractor, Comparator keyComparator)ãããããã®å Žåã¯èªç¶é åºä»ãã§ã¯ãªã第2åŒæ°ã®Comparatorã§æ¯èŒããŸãã reversed ãã®ã¡ãœãããåŒã³åºããComparatorã® éé ã§å€å®ãè¡ãComparatorãè¿ããŸãã éé ã§ãœãŒããããå Žåãæ¢åã®Comparatorã®éé ã§ãœãŒããããå Žåããã®ã¡ãœããã䜿ããšäŸ¿å©ã§ãã List<String> wordList = new ArrayList<>(Arrays.asList( "Today" , "is" , "a" , "good" , "day" )); List<String> sortedList = wordList.stream().sorted(Comparator.comparing(String::length).reversed()).toList(); // >[Today, good, day, is, a] naturalOrderã»reverseOrder Comparator. naturalOrder ()ã¯ãComparableãå®è£
ãããªããžã§ã¯ãã«ã€ããŠãèªç¶é åºä»ãã§æ¯èŒãããComparatorãè¿ããŸãã Comparator. reverseOrder ()ã¯ãComparableãå®è£
ãããªããžã§ã¯ãã«ã€ããŠãèªç¶é åºä»ãã® éé ã§æ¯èŒãããComparatorãè¿ããŸãã List<Integer> numberList = new ArrayList<>(Arrays.asList( 4 , 2 , 3 , 5 , 1 )); List<Integer> naturalSortedList = numberList.stream().sorted(Comparator.naturalOrder()).toList(); // > [1, 2, 3, 4, 5] // Comparableã®é
ã§æžããéãã以äžã®ããã«æžããŠãåãçµæã«ãªã // List<Integer> naturalSortedList = numberList.stream().sorted().toList(); List<Integer> reverseSortedList = numberList.stream().sorted(Comparator.reverseOrder()).toList(); // > [5, 4, 3, 2, 1] nullsFirstã»nullsLast Comparator. nullsFirst (Comparator comparator)ã¯ãnullãnull以å€ããå°ãããšã¿ãªããäž¡æ¹ãnull以å€ãªãåŒæ°ã®comparatorã«ããæ¯èŒãè¡ãComparatorãè¿ããŸãã ã€ãŸãããœãŒãæã«nullãå
é ã«æ¥ãããšã«ãªãã®ã§ãã Comparatorãå®è£
ããéã«æ¯èŒå¯Ÿè±¡ã«nullãå
¥ã£ãŠãããš NullPointerException ãçºçããå ŽåããããŸããã List<String> wordList = new ArrayList<>(Arrays.asList( "Today" , "is" , "a" , "good" , "day" , null )); List<String> sortedList = wordList.stream().sorted(Comparator.comparing(String::length)).toList(); // > NullPointerException nullsFirstã䜿çšããããšã§äŸå€çºçãé²ãããšãã§ããŸãã List<String> wordList = new ArrayList<>(Arrays.asList( "Today" , "is" , "a" , "good" , "day" , null )); List<String> sortedList = wordList.stream().sorted(Comparator.nullsFirst(Comparator.comparing(String::length))).toList(); // > [null, a, is, day, good, Today] nullsLastã¯ãã®éã§ãnullãnull以å€ãã倧ãããšã¿ãªããã€ãŸããœãŒãæã«nullãæ«å°Ÿã«æ¥ããããªComparatorãè¿ããŸãã thenComparing è€æ°æ¡ä»¶ã§ãœãŒã ãããšãã«äœ¿çšããã¡ãœããã§ãã Comparatorã®åŸãã«ã€ããŠåŒæ°ã§æ¯èŒæ¡ä»¶ãæå®ããããšã§ããã®Comparatorã0ãè¿ãããšãã«è¿œå ã®æ¡ä»¶ã§æ¯èŒããããšãã§ããŸãã åŒæ°ã«ã¯Comparatorã®ä»ãcomparingãšåæ§FunctionãFunction+Comparatorãå
¥ããããšãå¯èœã§ãã 以äžã®äŸã§ã¯ãStringã®ãªã¹ããæåæ°ã®æé ã§ãæåæ°ãåããã®ã«ã€ããŠã¯Stringã®èªç¶é åºä»ã(èŸæžé )ã§äžŠã¹æ¿ããŠããŸãã List<String> wordList = new ArrayList<>(Arrays.asList( "cat" , "dog" , "apple" , "banana" , "elephant" , "ant" , "zebra" )); List<String> sortedList = wordList.stream().sorted(Comparator.comparing(String::length).thenComparing(Comparator.naturalOrder())).toList(); // > [ant, cat, dog, apple, zebra, banana, elephant] ãŸãšã Comparator㯠Java ã§ãœãŒããè¡ãéã«éåžžã«éèŠã«ãªãã€ã³ã¿ãŒãã§ãŒã¹ã§ãã Webã¢ããªãªã©ã§ã¯ãããã SQL ã®ORDER BYã§ãœãŒãããŠãããã Java ã§ãœãŒããããå Žé¢ã¯å¿
ãããå€ããªãããšã¯æããŸãã ãšã¯ãã Java åŽã§ã®åŠçã®éäžã§ãœãŒããè¡ãåŠçããã£ããããã®ã§ã䜿ããããèŠããŠãããŠæã¯ãªãã§ãããã æ¬èšäºãComparatorãã²ããŠã¯ãœãŒãã®çè§£ã«å°ãã§ã圹ç«ãŠãã°å¹žãã§ãã