加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Comparable接口和Comparator接口的不同用法

发布时间:2020-12-14 06:33:03 所属栏目:Java 来源:网络整理
导读:两者都可用来在定义比较方法,然后用在排序中。 Comparable是类本身继承的接口 Comparator实在类外定义一个排序的类 比较而言,觉得Comparator更灵活一些,但是Comparable方便一些。 举个栗子: span style="color: #0000ff;"public span style="color: #000

两者都可用来在定义比较方法,然后用在排序中。

Comparable是类本身继承的接口

Comparator实在类外定义一个排序的类

比较而言,觉得Comparator更灵活一些,但是Comparable方便一些。

举个栗子:

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Main {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    ArrayList</span><Pair> list = <span style="color: #0000ff;"&gt;new</span> ArrayList<><span style="color: #000000;"&gt;();
    list.add(</span><span style="color: #0000ff;"&gt;new</span> Pair(8,1<span style="color: #000000;"&gt;));
    list.add(</span><span style="color: #0000ff;"&gt;new</span> Pair(6,5<span style="color: #000000;"&gt;));
    list.add(</span><span style="color: #0000ff;"&gt;new</span> Pair(6,3<span style="color: #000000;"&gt;));
    list.add(</span><span style="color: #0000ff;"&gt;new</span> Pair(5,7<span style="color: #000000;"&gt;));
    list.add(</span><span style="color: #0000ff;"&gt;new</span> Pair(4,9<span style="color: #000000;"&gt;));
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 用Comparator排序 -- 按照两个数的和排序</span>
    list.sort(<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; PairComparator());
    </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (Pair p: list)
        System.out.println(p);
    System.out.println();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 用Comparable排序 -- 先按第一个数排序  再按第二个数排序</span>

<span style="color: #000000;"> Collections.sort(list);
<span style="color: #0000ff;">for<span style="color: #000000;"> (Pair p: list)
System.out.println(p);
}
}

<span style="color: #0000ff;">class PairComparator <span style="color: #0000ff;">implements Comparator<span style="color: #000000;"> {

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; compare(Pair p1,Pair p2) {
    </span><span style="color: #0000ff;"&gt;int</span> sum1 =<span style="color: #000000;"&gt; p1.getSum();
    </span><span style="color: #0000ff;"&gt;int</span> sum2 =<span style="color: #000000;"&gt; p2.getSum();
    </span><span style="color: #0000ff;"&gt;return</span> (sum1 == sum2 ? 0 : (sum1 < sum2 ? -1 : 1<span style="color: #000000;"&gt;));
}

}

<span style="color: #0000ff;">class Pair <span style="color: #0000ff;">implements Comparable<span style="color: #000000;"> {

</span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; first;
</span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; second;

</span><span style="color: #0000ff;"&gt;public</span> Pair(<span style="color: #0000ff;"&gt;int</span> first,<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; second) {
    </span><span style="color: #0000ff;"&gt;this</span>.first =<span style="color: #000000;"&gt; first;
    </span><span style="color: #0000ff;"&gt;this</span>.second =<span style="color: #000000;"&gt; second;
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; compareTo(Pair p) {
    </span><span style="color: #0000ff;"&gt;if</span> (first ==<span style="color: #000000;"&gt; p.first) {
        </span><span style="color: #0000ff;"&gt;if</span> (second == p.second) <span style="color: #0000ff;"&gt;return</span> 0<span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;return</span> second < p.second ? -1 : 1<span style="color: #000000;"&gt;;
    }
    </span><span style="color: #0000ff;"&gt;return</span> first < p.first ? -1 : 1<span style="color: #000000;"&gt;;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; getSum() {
    </span><span style="color: #0000ff;"&gt;return</span> first +<span style="color: #000000;"&gt; second;
}

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String toString() {
    </span><span style="color: #0000ff;"&gt;return</span> "[first:" + first + ",second:" + second + ",sum:" + getSum() + "]"<span style="color: #000000;"&gt;;
}
</span><span style="color: #000000;"&gt;

}

输出:

[first:8,second:1,sum:96,second:3,second:5,sum:115,second:7,sum:124,second:9,sum:13[first:4,sum:13<span style="color: #000000;">]
[first:
5,sum:12<span style="color: #000000;">]
[first:
6,sum:11<span style="color: #000000;">]
[first:
8,sum:9]

对于一些已经写好的类,比如String,我们当然不能去修改它的compareTo()方法,于是可以写一个自定义的比较器。

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Main {
<span style="color: #0000ff;">public
<span style="color: #0000ff;">static
<span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
ArrayList list = <span style="color: #0000ff;">new ArrayList<><span style="color: #000000;">();
list.add("abcd"<span style="color: #000000;">);
list.add("bcd"<span style="color: #000000;">);
list.add("cd"<span style="color: #000000;">);
list.add("d"<span style="color: #000000;">);
Collections.sort(list);
System.out.println(list);
list.sort(<span style="color: #0000ff;">new<span style="color: #000000;"> MyStringComparator());
System.out.println(list);
}
}

<span style="color: #008000;">//<span style="color: #008000;"> 自定义的String排序方法 按字符串长度排序
<span style="color: #0000ff;">class MyStringComparator <span style="color: #0000ff;">implements Comparator<span style="color: #000000;"> {

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; compare(String o1,String o2) {
    </span><span style="color: #0000ff;"&gt;int</span> len1 =<span style="color: #000000;"&gt; o1.length();
    </span><span style="color: #0000ff;"&gt;int</span> len2 =<span style="color: #000000;"&gt; o2.length();
    </span><span style="color: #0000ff;"&gt;return</span> (len1 == len2 ? 0 : (len1 < len2 ? -1 : 1<span style="color: #000000;"&gt;));
}

}

输出:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读