<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java `Comparable`和`Comparator` 原文:http://zetcode.com/java/comparablecomparator/ Java `Comparable`和`Comparator`教程展示了如何比較 Java 中具有`Comparable`和`Comparator`接口的對象。 在進行排序時,比較兩個對象至關重要。 當使用自定義 Java 對象執行比較時,我們可以使用`Comparable`或`Comparator`接口。 ## Java 可比對象 `Comparable`接口對實現它的每個類的對象強加了總體排序。 此排序稱為類的自然排序。 該類的`compareTo()`方法必須實現以提供自然的比較。 ## Java 比較器 `Comparator`接口對某些對象集合強加了整體排序。 可以將比較器傳遞給排序方法(例如`Collections.sort()`或`Arrays.sort()`),以實現對排序順序的精確控制。 比較器還可以用于控制某些數據結構(例如排序集或排序映射)的順序,或為沒有自然順序的對象集合提供排序。 ## 可比對象與比較器 以下兩個列表總結了兩個接口之間的區別。 ### Java 可比對象 * 必須定義`o1.compareTo(o2)` * 用于實現對象的自然排序 * 我們必須修改要對其實例進行排序的類 * 在同一類 * 只有一種實現 * 在 API 中經常通過以下方式實現:字符串,包裝類,日期,日歷 ### Java 比較器 * 必須定義`compare(o1, o2)` * 比較類型的兩個實例的多種方法-例如按年齡,姓名比較人 * 我們可以為我們無法控制的類提供比較器 * 我們可以有多個比較器的實現 * 旨在實現對第三方類實例的排序 ## Java 內置比較器示例 Java 語言提供了一些內置的比較器。 `JavaBuiltInComparatorEx.java` ```java package com.zetcode; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class JavaBuiltInComparatorEx { public static void main(String[] args) { List<String> words = new ArrayList<>(); words.add("dog"); words.add("pen"); words.add("sky"); words.add("rock"); words.add("den"); words.add("fountain"); words.sort(Comparator.naturalOrder()); words.forEach(System.out::println); words.sort(Comparator.reverseOrder()); words.forEach(System.out::println); } } ``` 在示例中,我們按升序和降序對單詞數組進行排序。 ```java words.sort(Comparator.naturalOrder()); ``` `Comparator.naturalOrder()`返回內置的自然順序`Comparator`。 ```java words.sort(Comparator.reverseOrder()); ``` `Comparator.reverseOrder()`返回一個比較器,該比較器強加自然順序。 ## `Comparator.comparingInt` `Comparator.comparingInt()`方法從提供的類型中提取`int`排序鍵,并通過該鍵進行比較。 `JavaBuiltInComparatorEx2.java` ```java package com.zetcode; import java.util.Arrays; import java.util.Comparator; import java.util.List; class Person { private String name; private int age; public String getName() { return name; } public Person(String name, int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; }; public int getAge() { return this.age; } @Override public String toString() { final StringBuilder sb = new StringBuilder("Person{"); sb.append("name='").append(name).append('\''); sb.append(", age=").append(age); sb.append('}'); return sb.toString(); } } public class JavaBuiltInComparatorEx2 { public static void main(String[] args) { Person p1 = new Person("Robert", 23); Person p2 = new Person("Monika", 18); Person p3 = new Person("Tom", 37); Person p4 = new Person("Elisabeth", 31); List<Person> vals = Arrays.asList( p1, p2, p3, p4 ); vals.sort(Comparator.comparingInt(Person::getAge)); vals.forEach(System.out::println); } } ``` 在示例中,我們使用`Comparator.comparingInt()`方法比較了`Person`對象的年齡。 ```java Person{name='Monika', age=18} Person{name='Robert', age=23} Person{name='Elisabeth', age=31} Person{name='Tom', age=37} ``` 對象按年齡排序。 ## 多個比較器 通過`Comparator.thenComparing()`方法,我們可以在對對象進行排序時使用多個比較器。 `JavaMultipleComparatorsEx.java` ```java package com.zetcode; import java.util.Arrays; import java.util.Comparator; import java.util.List; // Comparing list of objects by multiple object fields class Person { private String name; private int age; private String city; public Person(String name, int age, String city) { this.name = name; this.age = age; this.city = city; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Override public String toString() { final StringBuilder sb = new StringBuilder("Person{"); sb.append("name='").append(name).append('\''); sb.append(", age=").append(age); sb.append(", city='").append(city).append('\''); sb.append('}'); return sb.toString(); } } public class JavaMultipleComparatorsEx { public static void main(String[] args) { List<Person> persons = Arrays.asList( new Person("Peter", 23, "New York"), new Person("Sarah", 13, "Las Vegas"), new Person("Lucy", 33, "Toronto"), new Person("Sarah", 21, "New York"), new Person("Tom", 18, "Toronto"), new Person("Robert", 23, "San Diego"), new Person("Lucy", 23, "Los Angeles"), new Person("Sam", 36, "Dallas"), new Person("Elisabeth", 31, "New York"), new Person("Ruth", 29, "New York"), new Person("Sarah", 41, "New York") ); persons.sort(Comparator.comparing(Person::getName) .thenComparing(Person::getCity) .thenComparing(Person::getAge)); persons.forEach(System.out::println); } } ``` 我們有`Person`對象的列表。 我們先按對象名稱比較對象,然后按城市比較對象,最后按年齡比較對象。 ```java persons.sort(Comparator.comparing(Person::getName) .thenComparing(Person::getCity) .thenComparing(Person::getAge)); ``` `Comparator.thenComparing()`方法允許我們將乘法比較器應用于排序操作。 ```java Person{name='Elisabeth', age=31, city='New York'} Person{name='Lucy', age=23, city='Los Angeles'} Person{name='Lucy', age=33, city='Toronto'} Person{name='Peter', age=23, city='New York'} Person{name='Robert', age=23, city='San Diego'} Person{name='Ruth', age=29, city='New York'} Person{name='Sam', age=36, city='Dallas'} Person{name='Sarah', age=13, city='Las Vegas'} Person{name='Sarah', age=21, city='New York'} Person{name='Sarah', age=41, city='New York'} Person{name='Tom', age=18, city='Toronto'} ``` 這是輸出。 ## Java 自定義比較器 在下一個示例中,我們創建一個自定義`Comparator`。 `JavaCustomComparator.java` ```java package com.zetcode; import java.util.Arrays; import java.util.List; public class JavaCustomComparatorEx { public static void main(String[] args) { List<String> words = Arrays.asList("pen", "blue", "atom", "to", "ecclesiastical", "abbey", "car", "ten", "desk", "slim", "journey", "forest", "landscape", "achievement", "Antarctica"); words.sort((e1, e2) -> e1.length() - e2.length()); words.forEach(System.out::println); words.sort((e1, e2) -> e2.length() - e1.length() ); words.forEach(System.out::println); } } ``` 我們有一個單詞表。 這次我們根據單詞的長度對其進行比較。 ```java words.sort((e1, e2) -> e1.length() - e2.length()); ``` 此自定義比較器用于按單詞的大小按升序對單詞進行排序。 ```java words.sort((e1, e2) -> e2.length() - e1.length() ); ``` 在第二種情況下,單詞按降序排序。 ```java to pen car ten blue atom desk slim abbey forest journey landscape Antarctica achievement ecclesiastical ecclesiastical achievement Antarctica landscape journey forest abbey blue atom desk slim pen car ten to ``` 這是輸出。 ## Java 自定義比較器 II 在下面的示例中,我們創建兩個自定義比較器。 `.java` ```java package com.zetcode; import java.util.Arrays; import java.util.Comparator; // Comparing objects with Comparator in array class Car { private String name; private int price; public Car(String name, int price) { this.name = name; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public String toString() { final StringBuilder sb = new StringBuilder("Car{"); sb.append("name='").append(name).append('\''); sb.append(", price=").append(price); sb.append('}'); return sb.toString(); } } class CompareByPrice implements Comparator<Car> { @Override public int compare(Car c1, Car c2) { return c1.getPrice() - c2.getPrice(); } } class CompareByName implements Comparator<Car> { @Override public int compare(Car c1, Car c2) { return c1.getName().compareTo(c2.getName()); } } public class JavaCustomComparatorEx2 { public static void main(String[] args) { Car[] cars = { new Car("Volvo", 23400), new Car("Mazda", 13700), new Car("Porsche", 353800), new Car("Skoda", 8900), new Car("Volkswagen", 19900) }; System.out.println("Comparison by price:"); Arrays.sort(cars, new CompareByPrice()); for (Car car : cars) { System.out.println(car); } System.out.println(); System.out.println("Comparison by name:"); Arrays.sort(cars, new CompareByName()); for (Car car : cars) { System.out.println(car); } } } ``` 我們有一個`Car`對象數組。 我們創建兩個自定義比較器,以按對象名稱和價格比較對象。 ```java class CompareByPrice implements Comparator<Car> { @Override public int compare(Car c1, Car c2) { return c1.getPrice() - c2.getPrice(); } } ... Arrays.sort(cars, new CompareByPrice()); ``` 定制的`CompareByPrice`比較器實現`Comparator`接口; 迫使我們實現`compare()`方法。 我們的實現通過價格比較汽車對象。 ```java class CompareByName implements Comparator<Car> { @Override public int compare(Car c1, Car c2) { return c1.getName().compareTo(c2.getName()); } } ... Arrays.sort(cars, new CompareByName()); ``` 在第二種情況下,我們通過名稱比較汽車對象。 ```java Comparison by price: Car{name='Skoda', price=8900} Car{name='Mazda', price=13700} Car{name='Volkswagen', price=19900} Car{name='Volvo', price=23400} Car{name='Porsche', price=353800} Comparison by name: Car{name='Mazda', price=13700} Car{name='Porsche', price=353800} Car{name='Skoda', price=8900} Car{name='Volkswagen', price=19900} Car{name='Volvo', price=23400} ``` 這是出乎意料的。 ## Java 可比對象示例 在下面的示例中,我們將對象與`Comparable`進行比較。 `JavaComparableEx.java` ```java package com.zetcode; import java.util.Arrays; import java.util.Comparator; class Card implements Comparable<Card> { @Override public int compareTo(Card o) { return Comparator.comparing(Card::getValue) .thenComparing(Card::getSuit) .compare(this, o); } public enum Suits { SPADES, CLUBS, HEARTS, DIAMONDS } public enum Values { TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE, } private Suits suit; private Values value; public Card(Values value, Suits suit) { this.value = value; this.suit = suit; } public Values getValue() { return value; } public Suits getSuit() { return suit; } public void showCard() { value = getValue(); suit = getSuit(); System.out.println(value + " of " + suit); } @Override public String toString() { final StringBuilder sb = new StringBuilder("Card{"); sb.append("suit=").append(suit); sb.append(", value=").append(value); sb.append('}'); return sb.toString(); } } public class JavaComparableEx { public static void main(String[] args) { Card[] cards = { new Card(Card.Values.KING, Card.Suits.DIAMONDS), new Card(Card.Values.FIVE, Card.Suits.HEARTS), new Card(Card.Values.ACE, Card.Suits.CLUBS), new Card(Card.Values.NINE, Card.Suits.SPADES), new Card(Card.Values.JACK, Card.Suits.SPADES), new Card(Card.Values.JACK, Card.Suits.DIAMONDS),}; for (Card card: cards) { System.out.println(card); } } } ``` 我們有`Card`對象的列表。 每張卡都有一個值,并且屬于西服。 我們實現`Comparable`接口,以便為`Card`類的對象提供一些自然的排序。 ```java @Override public int compareTo(Card o) { return Comparator.comparing(Card::getValue) .thenComparing(Card::getSuit) .compare(this, o); } ``` 我們實現`compareTo()`方法。 我們首先比較卡片的值,然后根據西裝的值。 ```java Card{suit=HEARTS, value=FIVE} Card{suit=SPADES, value=NINE} Card{suit=SPADES, value=JACK} Card{suit=DIAMONDS, value=JACK} Card{suit=DIAMONDS, value=KING} Card{suit=CLUBS, value=ACE} ``` 這是輸出。 在本教程中,我們展示了如何使用`Comparable`和`Comparator`在 Java 中比較對象。 您可能也對相關教程感興趣: [Java 教程](/lang/java/),[用 Java 閱讀文本文件](/articles/javareadtext/)和[用 Java](/articles/javafilterlist/) 過濾列表。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看