08_List集合去重及排序

@Author Jacky Wang

日常積累衬吆,轉(zhuǎn)載請(qǐng)注明出處算芯,http://www.reibang.com/p/0cf21d08b78e

一. List集合排序

需求:根據(jù)List集合中商品對(duì)象的銷(xiāo)售狀態(tài)進(jìn)行排序,未支付的商品放在前面,已支付的放在后面

List<WXPrepayStockVO> appletShowGoodsInfo = appletGoodsInfoShow(stockVO);
// 根據(jù)銷(xiāo)售狀態(tài)排序,方便前臺(tái)展示
Collections.sort(appletShowGoodsInfo, new Comparator<WXPrepayStockVO>() {

    @Override
    public int compare(WXPrepayStockVO o1, WXPrepayStockVO o2) {
        String ss1 = o1.getSaleStatus();
        String ss2 = o2.getSaleStatus();
        // 正序排序
        return ss1.compareTo(ss2);
        // 倒序排序
        // return ss2.compareTo(ss2);
    }
});

1.1 Collections.sort()的兩種用法

Collections是一個(gè)工具類(lèi),sort是其中的靜態(tài)方法,是用來(lái)對(duì)List類(lèi)型進(jìn)行排序的,它有兩種參數(shù)形式:

1. 
public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}

2. 
public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}

1.2 兩種用法的區(qū)別及示例

Collections.sort()默認(rèn)正序排序。上述兩種方式都支持排序,那兩者的區(qū)別在哪呢?

1. 兩種方式都支持默認(rèn)的正序排序,但對(duì)于普通類(lèi)型例如Integer,如果需要逆序排序,第一種方式就不能實(shí)現(xiàn)了。
此處用Integer演示第一種方式:

List<Integer> intList = Arrays.asList(2, 3, 1);
Collections.sort(intList);
PrintUtil.showList(intList);

打印結(jié)果為: 1,2,3

如果要實(shí)現(xiàn)逆序就得用第二種方式了:

Collections.sort(intList,new Comparator<Integer>() {

    @Override
    public int compare(Integer o1, Integer o2) {
        // 返回值為int類(lèi)型耐量,大于0表示正序,小于0表示逆序
        return o2-o1;
    }
});
System.out.println("after sort:");
PrintUtil.showList(intList);

打印結(jié)果為: 3,2,1
    

2. 對(duì)于自定義類(lèi)的排序,兩種方式都可以實(shí)現(xiàn),不同的是第一種方式在實(shí)體類(lèi)中實(shí)現(xiàn)Comparable接口的CompareTo方法排序,第二種方式在sort方法中實(shí)現(xiàn)compareTo方法進(jìn)行排序迎卤。

以上述需求為例,以銷(xiāo)售狀態(tài)排序,CompareTo方法事實(shí)上比較的是Unicode碼的大小:

第一種方式實(shí)現(xiàn):(實(shí)體類(lèi)中實(shí)現(xiàn)Comparable接口)

public class WXPrepayStockVO implements Serializable,Comparable<WXPrepayStockVO> {

    private static final long serialVersionUID = -4198487626404096752L;

    private String mpName; // 商品單品名
    private String mpPrice;// 單品銷(xiāo)售價(jià)
    private String mpVipPrice;// 單品會(huì)員價(jià)
    private Long qty;// 銷(xiāo)售數(shù)量
    private String saleStatus;// 銷(xiāo)售狀態(tài)
    private List<String> epcs;

    public String getSaleStatus() {
        return saleStatus;
    }

    public void setSaleStatus(String saleStatus) {
        this.saleStatus = saleStatus;
    }

    @Override
    public int compareTo(WXPrepayStockVO o) {
        //按銷(xiāo)售狀態(tài)正序排序
        return this.getSaleStatus().compareTo(o.getSaleStatus());
        // 按銷(xiāo)售狀態(tài)逆序排序
        // return o.getSaleStatus().compareTo(this.getSaleStatus());
    }
}

則在使用時(shí)直接調(diào)用:Collections.sort(list);排序即可玷坠。

第二種方式實(shí)現(xiàn):

List<WXPrepayStockVO> appletShowGoodsInfo = appletGoodsInfoShow(stockVO);
// 根據(jù)銷(xiāo)售狀態(tài)排序蜗搔,方便前臺(tái)展示
Collections.sort(appletShowGoodsInfo, new Comparator<WXPrepayStockVO>() {

    @Override
    public int compare(WXPrepayStockVO o1, WXPrepayStockVO o2) {
        String ss1 = o1.getSaleStatus();
        String ss2 = o2.getSaleStatus();
        // 正序排序
        return ss1.compareTo(ss2);
        // 倒序排序
        // return ss2.compareTo(ss2);
    }
});

總結(jié):

1. 對(duì)于String或Integer這些已經(jīng)實(shí)現(xiàn)Comparable接口的類(lèi)來(lái)說(shuō),可以直接使用Collections.sort方法傳入list參數(shù)來(lái)實(shí)現(xiàn)默認(rèn)方式(正序)排序八堡;
2.對(duì)于自定義類(lèi)型(如本例子中的Emp)樟凄,如果想使用Collections.sort的方式一進(jìn)行排序,可以通過(guò)實(shí)現(xiàn)Comparable接口的compareTo方法來(lái)使用兄渺》炝洌或者使用第二種方式完成排序

2. 使用TreeSet給List去重

private List<DeviceServiceLog> removeDuplicateRecord(List<DeviceServiceLog> deviceServiceLogList) {
    Set<DeviceServiceLog> set = new TreeSet<>(new Comparator<DeviceServiceLog>() {

        @Override
        public int compare(DeviceServiceLog o1, DeviceServiceLog o2) {
            return o1.getServiceCode().compareTo(o2.getServiceCode());
        }

    });
    set.addAll(deviceServiceLogList);
    return new ArrayList<>(set);
}

2.1 TreeSet構(gòu)造去重的兩種方式

1. 
public TreeSet(Collection<? extends E> c) {
    this();
    addAll(c);
}

2. 
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}

2.2 兩種用法的區(qū)別及示例

解析:
TreeSet中的數(shù)據(jù)是有序不重復(fù)的,利用TreeSet可以給List對(duì)象進(jìn)行去重及排序操作。
上面例子挂谍,是根據(jù)serviceCode的設(shè)備編碼去重及排序叔壤。

1. 對(duì)于普通類(lèi)型,Integer,String直接調(diào)用第一種方式即可完成去重。
但如果是自定義類(lèi),第一種方式就必須在對(duì)應(yīng)的類(lèi)中實(shí)現(xiàn)hashCode及equals方法,TreeSet就知道如何區(qū)分兩個(gè)對(duì)象屬于同一個(gè)對(duì)象口叙。
如果還想實(shí)現(xiàn)自定義排序,則再實(shí)現(xiàn)CompareTo方法炼绘。

2. 第二種方式,使用匿名內(nèi)部類(lèi),實(shí)現(xiàn)Comparable接口的compareTo接口完成去重,compareTo中如果返回0代表相同。
示例中就使用此方法根據(jù)實(shí)體類(lèi)的某一字段實(shí)現(xiàn)的去重,如果要根據(jù)多個(gè)字段去重的話(huà),使用該方式或使用自定義類(lèi)重寫(xiě)hashCode與equals方法會(huì)都可以妄田。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俺亮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疟呐,更是在濱河造成了極大的恐慌脚曾,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件启具,死亡現(xiàn)場(chǎng)離奇詭異本讥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鲁冯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)囤踩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晓褪,你說(shuō)我怎么就攤上這事堵漱。” “怎么了涣仿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵勤庐,是天一觀的道長(zhǎng)示惊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)愉镰,這世上最難降的妖魔是什么米罚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮丈探,結(jié)果婚禮上录择,老公的妹妹穿的比我還像新娘。我一直安慰自己碗降,他們只是感情好隘竭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著讼渊,像睡著了一般动看。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爪幻,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天菱皆,我揣著相機(jī)與錄音,去河邊找鬼挨稿。 笑死仇轻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奶甘。 我是一名探鬼主播拯田,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甩十!你這毒婦竟也來(lái)了船庇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侣监,失蹤者是張志新(化名)和其女友劉穎鸭轮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體橄霉,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窃爷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姓蜂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片按厘。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钱慢,靈堂內(nèi)的尸體忽然破棺而出逮京,到底是詐尸還是另有隱情,我是刑警寧澤束莫,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布懒棉,位于F島的核電站草描,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏策严。R本人自食惡果不足惜穗慕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妻导。 院中可真熱鬧逛绵,春花似錦、人聲如沸倔韭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狐肢。三九已至添吗,卻和暖如春沥曹,著一層夾襖步出監(jiān)牢的瞬間份名,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工妓美, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僵腺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓壶栋,卻偏偏與公主長(zhǎng)得像辰如,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贵试,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345