一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘

java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘

2020-08-19 17:28256g的胃 Java教程

這篇文章主要介紹了java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

本人由于項(xiàng)目開(kāi)發(fā)中需要對(duì)查詢結(jié)果list進(jìn)行排序,這里根據(jù)的是每一個(gè)對(duì)象中的創(chuàng)建時(shí)間降序排序。本人講解不深,只實(shí)現(xiàn)目的,如需理解原理還需查閱更深的資料。

1.實(shí)現(xiàn)的效果

java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘

2.創(chuàng)建排序的對(duì)象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.practice.test.comparable;
import java.util.Date;
 
/**
 * 描述:要比較的對(duì)象
 *
 * @author cui
 * @create 2018-12-18 14:07
 */
public class MySortBean implements Comparable<MySortBean> {
  private String name;
  private int age;
  private Date createTime;
 
 
  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 Date getCreateTime() {
    return createTime;
  }
 
  public void setCreateTime(Date createTime) {
    this.createTime = createTime;
  }
 
//  @Override
//  public int compareTo(MySortBean o) {
//    if (this.age>o.age){
//      return -1;
//    }else if (this.age==o.age){
//      return 0;
//    }
//    return 1;
//  }
    @Override
    public int compareTo(MySortBean o) {
      if (this.createTime.compareTo(o.getCreateTime())>0){
        return -1;
      }else if (this.createTime.compareTo(o.getCreateTime())==0){
        return 0;
      }
      return 1;
    }
 
  @Override
  public String toString() {
    return "MySortBean{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
  }
}

3.編寫(xiě)test方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.practice.test;
import com.practice.test.comparable.MySortBean;
import com.spring.testlist.util.DateUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/**
 * 描述:
 * 測(cè)試比較器
 *
 * @author cui
 * @create 2018-12-18 14:10
 */
@RunWith(SpringJUnit4ClassRunner.class)
public class TestCompare {
 
  @Test
  public void testComparable(){
    MySortBean m1 = new MySortBean();
    m1.setAge(1);
    m1.setCreateTime(DateUtil.parseDate("2019-01-21 16:13:18"));
    MySortBean m2 = new MySortBean();
    m2.setAge(2);
    m2.setCreateTime(DateUtil.parseDate("2019-01-23 16:13:18"));
    MySortBean m3 = new MySortBean();
    m3.setAge(3);
    m3.setCreateTime(DateUtil.parseDate("2019-01-22 16:13:18"));
    MySortBean m4 = new MySortBean();
    m4.setAge(4);
    m4.setCreateTime(DateUtil.parseDate("2019-01-24 16:13:18"));
    MySortBean m5 = new MySortBean();
    m5.setAge(5);
    m5.setCreateTime(DateUtil.parseDate("2019-01-25 16:13:18"));
    List<MySortBean> l = new ArrayList<>(5);
    l.add(m1);
    l.add(m2);
    l.add(m4);
    l.add(m5);
    l.add(m3);
 
    System.out.println("排序前:");
    for (MySortBean i:l) {
      System.out.println(DateUtil.formatDate(i.getCreateTime(),"yyyy-MM-dd HH:mm:ss"));
    }
    /**
     * 自定義排序
     * 直接return -1 倒敘排列,list順序顛倒輸出
     *
     * if (o1.getAge()>o2.getAge()){
     *           return 1;
     *         }
     *         return -1;
     *         以上升序輸出
     *
     * if (o1.getAge()>o2.getAge()){
     *           return -1;
     *         }
     *         return 1;
     *         以上降序輸出
     *
     *
     */
/*    Comparator<MySortBean> comparator = new Comparator<MySortBean>() {
      @Override
      public int compare(MySortBean o1,MySortBean o2) {
        if (o1.getAge()>o2.getAge()){
          return -1;
        }
        return 1;
      }
    };
    l.sort(comparator);*/
    l.sort(MySortBean::compareTo);
    System.out.println("--------");
    System.out.println("排序后:");
    for (MySortBean i:l) {
      System.out.println(DateUtil.formatDate(i.getCreateTime(),"yyyy-MM-dd HH:mm:ss"));
    }
  }
}

4.時(shí)間格式化工具類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
package com.spring.testlist.util;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
/**
 * 日期工具類, 繼承org.apache.commons.lang.time.DateUtils類
 *
 * @author cui
 * @create 2018-10-26 15:30
 **/
public class DateUtil extends org.apache.commons.lang3.time.DateUtils{
 
    private static String[] parsePatterns = {
        "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
        "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
        "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
 
    /**
     * 得到當(dāng)前日期字符串 格式(yyyy-MM-dd)
     */
    public static String getDate() {
      return getDate("yyyy-MM-dd");
    }
  /**
   * 得到當(dāng)前日期字符串 格式(yyyyMMdd)
   */
  public static String getSizeDate() {
    return getDate("yyyyMMdd");
  }
 
    /**
     * 得到當(dāng)前日期字符串 格式(yyyy-MM-dd) pattern可以為:"yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String getDate(String pattern) {
      return DateFormatUtils.format(new Date(), pattern);
    }
 
    /**
     * 得到日期字符串 默認(rèn)格式(yyyy-MM-dd) pattern可以為:"yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String formatDate(Date date, Object... pattern) {
      if (date == null) {
        return null;
      }
      String formatDate = null;
      if (pattern != null && pattern.length > 0) {
        formatDate = DateFormatUtils.format(date, pattern[0].toString());
      } else {
        formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
      }
      return formatDate;
    }
 
    /**
     * 得到日期時(shí)間字符串,轉(zhuǎn)換格式(yyyy-MM-dd HH:mm:ss)
     */
    public static String formatDateTime(Date date) {
      return formatDate(date, "yyyy-MM-dd HH:mm:ss");
    }
 
    /**
     * 得到當(dāng)前時(shí)間字符串 格式(HH:mm:ss)
     */
    public static String getTime() {
      return formatDate(new Date(), "HH:mm:ss");
    }
 
    /**
     * 得到當(dāng)前日期和時(shí)間字符串 格式(yyyy-MM-dd HH:mm:ss)
     */
    public static String getDateTime() {
      return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
    }
 
    /**
     * 得到當(dāng)前年份字符串 格式(yyyy)
     */
    public static String getYear() {
      return formatDate(new Date(), "yyyy");
    }
 
    /**
     * 得到當(dāng)前月份字符串 格式(MM)
     */
    public static String getMonth() {
      return formatDate(new Date(), "MM");
    }
 
    /**
     * 得到當(dāng)天字符串 格式(dd)
     */
    public static String getDay() {
      return formatDate(new Date(), "dd");
    }
 
    /**
     * 得到當(dāng)前星期字符串 格式(E)星期幾
     */
    public static String getWeek() {
      return formatDate(new Date(), "E");
    }
 
    /**
     * 日期型字符串轉(zhuǎn)化為日期 格式
     * { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
     * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm",
     * "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" }
     */
    public static Date parseDate(Object str) {
      if (str == null) {
        return null;
      }
      try {
        return parseDate(str.toString(), parsePatterns);
      } catch (ParseException e) {
        return null;
      }
    }
    /**
     * 獲取過(guò)去的天數(shù)
     *
     * @param date
     * @return
     */
    public static long pastDays(Date date) {
 
      long t = System.currentTimeMillis()- date.getTime();
      return t / (24 * 60 * 60 * 1000);
    }
    /**
     * 獲取過(guò)去的小時(shí)
     *
     * @param date
     * @return
     */
    public static long pastHour(Date date) {
      long t =System.currentTimeMillis() - date.getTime();
      return t / (60 * 60 * 1000);
    }
    /**
     * 獲取過(guò)去的分鐘
     *
     * @param date
     * @return
     */
    public static long pastMinutes(Date date) {
      long t = System.currentTimeMillis() - date.getTime();
      return t / (60 * 1000);
    }
    /**
     * 轉(zhuǎn)換為時(shí)間(天,時(shí):分:秒.毫秒)
     *
     * @param timeMillis
     * @return
     */
    public static String formatDateTime(long timeMillis) {
      long day = timeMillis / (24 * 60 * 60 * 1000);
      long hour = (timeMillis / (60 * 60 * 1000) - day * 24);
      long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60);
      long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
      long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
      return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss;
    }
    /**
     * 獲取兩個(gè)日期之間的天數(shù)
     *
     * @param before
     * @param after
     * @return
     */
    public static double getDistanceOfTwoDate(Date before, Date after) {
      long beforeTime = before.getTime();
      long afterTime = after.getTime();
      return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
    }
    public static String getFirstDayOfMonth() {
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      //獲取當(dāng)前月第一天:
      Calendar c = Calendar.getInstance();
      c.add(Calendar.MONTH, 0);
      c.set(Calendar.DAY_OF_MONTH, 1);//設(shè)置為1號(hào),當(dāng)前日期既為本月第一天
      String first = format.format(c.getTime());
      return first;
    }
    /**
     * @param args
     * @throws ParseException
     */
    public static void main(String[] args) throws ParseException {
// System.out.println(formatDate(parseDate("2010/3/6")));
// System.out.println(getDate("yyyy年MM月dd日 E"));
// long time = new Date().getTime()-parseDate("2012-11-19").getTime();
// System.out.println(time/(24*60*60*1000));
      String sizeDate = formatDate(new Date(),"yyyyMMdd");
      System.out.println(sizeDate);
    }
}

到此就結(jié)束了,具體的要實(shí)現(xiàn)什么排序,根據(jù)示例自己腦補(bǔ)擴(kuò)展就好了,例子中備注也已經(jīng)標(biāo)注。

在使用排序注意兩個(gè)坑

1.要排序的字段為空的異常處理

2.要排序的字段相等的異常處理

補(bǔ)充知識(shí):Java中的自然排序和比較器排序

寫(xiě)在前面的話:剛開(kāi)始學(xué)習(xí)著兩者排序時(shí)我也是一頭霧水,雖然能寫(xiě)出來(lái)但是稀里糊涂,幾時(shí)該用哪個(gè)排序一點(diǎn)想法都沒(méi)有,后來(lái)經(jīng)過(guò)研究這兩者的作用點(diǎn)不同,自然排序作用在實(shí)體類上,而比較器排序作用在裝實(shí)體類的集合上。

1、自然排序:java.lang.Comparable

Comparable 接口中只提供了一個(gè)方法: compareTo(Object obj) ,該方法的返回值是 int 。如果返回值為正數(shù),則表示當(dāng)前對(duì)象(調(diào)用該方法的對(duì)象)比 obj 對(duì)象“大”;反之“小”;如果為零的話,則表示兩對(duì)象相等。

總結(jié)為一句話:實(shí)現(xiàn)Comparable,重寫(xiě) compareTo方法

案列:以TreeMap為例,默認(rèn)的升序,可以重寫(xiě)自然排序的方法改變?cè)信判?/p>

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public static void testComparable(){
    TreeMap<Car,Object> tmp = new TreeMap<Car,Object>();
    tmp.put(new Car(4), "肆");
    tmp.put(new Car(1), "壹");
    tmp.put(new Car(5), "伍");
    tmp.put(new Car(3), "三");
    tmp.put(new Car(2), "貳");
    System.out.println(tmp);
    //結(jié)果://{Car [price=5.0]=伍, Car [price=4.0]=肆, Car [price=3.0]=三, Car [price=2.0]=貳, Car [price=1.0]=壹}
  }
//自定義TreeMap排序方法  自然排序 
 
class Car implements Comparable<Car>{
  private double price;
  
  public double getPrice() {
    return price;
  }
 
  public void setPrice(double price) {
    this.price = price;
  }
 
  public Car(int price) {
    super();
    this.price = price;
  }
 
  @Override
  public int compareTo(Car o) {
    // TODO Auto-generated method stub
    if(this.price>o.getPrice()){
      return -1;//大的往前排
    }else if(this.price<o.getPrice()){
      return 1;//小的往后排
    }else{
      return 0;
    }
  }
 
  @Override
  public String toString() {
    return "Car [price=" + price + "]";
  }

2、比較器排序:java.util.Comparator

總結(jié)為一句話:實(shí)現(xiàn)Comparator 接口,重寫(xiě)compare方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void testComparator(){
    //HashMap<Integer,Object> hm = new HashMap<Integer,Object>();
    TreeMap<Integer,Object> tmp = new TreeMap<Integer,Object>(new MyComparatorBigtoSmall());
    tmp.put(4, "肆");
    tmp.put(1, "壹");
    tmp.put(5, "伍");
    tmp.put(3, "三");
    tmp.put(2, "貳");
    //System.out.println(tmp);//默認(rèn)排序結(jié)果:{1=壹, 2=貳, 3=三, 4=肆, 5=伍}
    System.out.println(tmp);//修改為比較器排序(升序){5=伍, 4=肆, 3=三, 2=貳, 1=壹}
  }
 
//自定義TreeMap排序方法  比較器排序 
  class MyComparatorBigtoSmall implements Comparator<Integer>{
 
    @Override
    public int compare(Integer o1, Integer o2) {
      // TODO Auto-generated method stub
      return o2-o1;
    }
  }

以上這篇java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/C1041067258/article/details/86578188

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品极品 | 教师波多野结衣在线播放 | 国产3p在线 | 二区免费视频 | 第一国内永久免费福利视频 | 91视在线国内在线播放酒店 | 日本在线观看www鲁啊鲁视频 | 日本一区二区精品88 | 啪啪大幂幂被c | 成年性午夜免费视频网站不卡 | 毛片在线网址 | 思思久久精品在热线热 | 天天插伊人 | 久久久久久免费高清电影 | 91人成尤物在线 | 天天做天天爱天天综合网 | 男人女人日皮 | 欧美一级精品 | 狠狠婷婷综合缴情亚洲 | 男人女人插 | 久久精品国产免费 | 青青青青青国产费线在线观看 | 小早川怜子视频在线观看 | 国产精品aⅴ | 嗯啊视频在线 | 日韩一级生活片 | 日韩国产欧美精品综合二区 | 日韩一区二三区无 | 手机国产乱子伦精品视频 | 欧美成人午夜片一一在线观看 | 国产小视频免费看 | 被肉日常np高h | 7个黑人玩北条麻妃 | 别停好爽好深好大好舒服视频 | 草逼视频网站 | 精品国产一区二区三区久久影院 | 我的家教老师在线观看 | 日本一级不卡一二三区免费 | 男人把大ji巴放进男人免费视频 | 精品一区二区三区高清免费不卡 | 日本性生活大片 |