Comparable VS Comparator

2434 ワード

Comparable VS Comparator


CompareableとComparatorは、インタフェースを介してソート基準を実現するために使用されます.
  • CompabilityインタフェースはcompareTo()メソッドを上書きすることによって実現される.
  • は、通常、並べ替えるオブジェクトにCompareableインタフェースを追加することによって実現される.
  • Comparatorインタフェースは、comparare()メソッドを上書きすることによって実現される.
  • は、通常、異なるクラスを定義することによって実現されるので、同じオブジェクトに対して異なるソート基準を持つクラスを作成することができる.
  • Compareableの例

    public class Edge implements Comparable<Edge>{
    
        public int distance;
        public String vertex;
    
        public Edge(int distance, String vertex) {
            this.distance = distance;
            this.vertex = vertex;
        }
    
        @Override
        public int compareTo(Edge e) {
            return this.distance - e.distance;
        }
    }
    
    public static void main(String[] args) {
        final Edge edge1 = new Edge(10, "A");
        final Edge edge2 = new Edge(260, "A");
        final Edge edge3 = new Edge(30, "A");
    
        Edge[] edges = new Edge[]{edge1, edge2, edge3};
    
        Arrays.sort(edges);
    
        for (Edge edge : edges) {
            System.out.println(edge.getDistance());
        }
     }

    実行結果


    10,30,260

    Comparatorの例

        public static void main(String[] args) {
            final Edge edge1 = new Edge(10, "A");
            final Edge edge2 = new Edge(260, "A");
            final Edge edge3 = new Edge(30, "A");
    
            Edge[] edges = new Edge[]{edge1, edge2, edge3};
    
            Arrays.sort(edges, new Comparator<Edge>() {
                @Override
                public int compare(Edge o1, Edge o2) {
                    return o2.getDistance() - o1.getDistance();
                }
            });
    
            for (Edge edge : edges) {
                System.out.println(edge.getDistance());
            }
        }

    実行結果


    260,30,10

    Arrays.sort()とCompartor


    Arrays.sort()メソッドは、2番目のパラメータにComparatorクラスを入れることができます.
    オブジェクトにCompareableインタフェースが定義されている場合は、Compareatorクラスのソート基準に従ってソートできます.
    ComparatorインタフェースはRamdaでも実現できる.
            Arrays.sort(edges, (o1, o2) -> o2.getDistance() - o1.getDistance());