JavaにおけるList集合のデリバリー

8978 ワード

オリジナルの文章、転載は出典を表示してください:https://blog.csdn.net/loubing1990/article/details/86682640
先例
コードを見る
List list = Lists.newArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(1);
        list.add(3);

 リストで繰り返されるデータを削除すると、Setには重み付け機能があると思うかもしれませんが、Setは無秩序で、私たちが望む結果が重み付けされた後、順序が乱れてはいけないので、Setは使えません.どうしよう?私の最初の書き方はこうでした
public List removeDuplicate(List list){        
    List temp = Lists.newArrayList();
    Map ml = Maps.newHashMap();
    list.forEach(t -> {
        if(!ml.containsKey(t)) {
            temp.add(t);
        }
        ml.put(t,t);
    });
    return temp;
}

このように書くと確かに問題が解決しますが、リストのいくつかの集合であればどうしますか?では、汎用型を使いましょう.コードを見てください.
​
public  List removeDuplicate(List list){        
    List temp = Lists.newArrayList();
    Map ml = Maps.newHashMap();
    list.forEach(t -> {
        if(!ml.containsKey(t)) {
            temp.add(t);
        }
        ml.put(t,t);
    });
    return temp;
}

​

ここまでは通用するでしょうが、数日後に私がコードを書いたとき、また同じニーズに遭遇しました.このときは簡単なリストやリストではありません.もし私がオブジェクトTenderを持っていたら.
public class Tender {

    private Long userId;

    private BigDecimal bidAmt;

    public Long getUserId(){

    }
    
    public BigDecimal getBidAmt(){

    }
}

しかし需要はこのようにして、Listの中で、Tenderの中のuserIdを通じて重くして、どのようにしますか?上の方法は使えないのではないでしょうか.では、方法を書き直します.
​
public List removeDuplicate(List list){        
    List temp = Lists.newArrayList();
    Map ml = Maps.newHashMap();
    list.forEach(t -> {
        if(!ml.containsKey(t.getUserId())) {
            temp.add(t);
        }
        ml.put(t.getUserId(),t);
    });
    return temp;
}

​

これで目の前の問題も解決しますが、対象はテンダーではないでしょうか?それともTenderのもう一つの属性に基づいて判断して重くしますか?それはまた書き直さなければなりませんか.
では、私たちはその中の法則を探して、抽出して、発見しましたか?今まで、見たのは2つの変化があって、1つはリストの中の要素で、1つは比較目標で、要素はまあで、汎用型でいいですが、比較目標は?
考えてみれば...
じゃあインタフェースで
インタフェースを定義します
/**
 *       
 * @author lb tomail:[email protected]
 * @date 2019-1-18 0018 14:27
 */
public interface DuplicateMark {

    E getDuplicateMark(T t);

}

コード中のTはインパラメータであり,Eはアウトパラメータである.
必要に応じてこのインタフェースを実現すればよいので,得られる脱重方法はこうである.
    public static   List removeDuplicateNew(List list, DuplicateMark d){
        List ret = Lists.newArrayList();
        Map ml = Maps.newHashMap();
        list.forEach(t -> {
            if(!ml.containsKey(d.getDuplicateMark(t))) {
                ret.add(t);
            }
            ml.put(d.getDuplicateMark(t),t);
        });
        return ret;
    }

これで通用するかな...
では、私の完全なコードを見てみましょう.
package com.lb.seller.util;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.lb.seller.model.dto.BidTenderDto;

import java.util.List;
import java.util.Map;

/**
 * @author lb [email protected]
 * @date 2019-1-18 0018 14:27
 */
public class CollectionsUtil {


    /**
     *     ,     Set  ,    Set list      
     * DuplicateMark.getDuplicateMark            
     * @return
     */
    public static   void removeDuplicate(List list, DuplicateMark d){
        if(list == null) {
            return;
        }
        List ret = removeDuplicateNew(list,d);
        list.removeAll(list);
        list.addAll(ret);
    }

    /**
     *     ,     Set  ,    Set list      
     * DuplicateMark.getDuplicateMark            
     * @return   list  ,      list
     */
    public static   List removeDuplicateNew(List list, DuplicateMark d){
        if(list == null) {
            return null;
        }
        List ret = Lists.newArrayList();
        Map ml = Maps.newHashMap();
        list.forEach(t -> {
            if(!ml.containsKey(d.getDuplicateMark(t))) {
                ret.add(t);
            }
            ml.put(d.getDuplicateMark(t),t);
        });
        return ret;
    }

    /**
     *   source    ,   reference   
     *      * DuplicateMark.getDuplicateMark            
     *      * @return   list  ,      list
     * @param source          
     * @param reference      
     * @param d             
     * @param 
     * @param 
     */
    public static    void removeDuplicate(List source,List reference, DuplicateMark d){
        if(source == null) {
            return ;
        }
        if(reference == null) {
            return ;
        }
        List ret = removeDuplicateNew(source,reference,d);
        source.removeAll(source);
        source.addAll(ret);
    }

    /**
     *   source    ,   reference   
     *  DuplicateMark.getDuplicateMark            
     * @param source          
     * @param reference      
     * @param d             
     * @param 
     * @param 
     * @return   list  ,      list
     */
    public static    List removeDuplicateNew(List source,List reference, DuplicateMark d){
        if(source == null) {
            return null;
        }
        if(reference == null) {
            return source;
        }

        Map mll = Maps.newHashMap();
        reference.forEach(t -> {
            mll.put(d.getDuplicateMark(t),t);
        });
        List temp = Lists.newArrayList();
        source.forEach( t -> {
            if(!mll.containsKey(d.getDuplicateMark(t))) {
                temp.add(t);
            }
        });
        source = temp;
        return source;
    }

    /**
     *      list    
     * CollectionsConditions.filter        
     * @return
     */
    public static   void filterByConditions(List list, CollectionsConditions d){
        if(list == null) {
            return ;
        }
        List ret = filterByConditionsNew(list,d);
        list.removeAll(list);
        list.addAll(ret);
    }

    /**
     *      list    
     * CollectionsConditions.filter        
     * @return   list  ,      list
     */
    public static   List  filterByConditionsNew(List list, CollectionsConditions d){
        if(list == null) {
            return null;
        }
        List ret = Lists.newArrayList();
        list.forEach(t -> {
            if(d.filter(t)) {
                ret.add(t);
            }
        });
        return ret;
    }

    public static void main(String[] args) {
        List longs = Lists.newArrayList();
        longs.add(1);
        longs.add(2);
        longs.add(3);
        longs.add(1);
        longs.add(3);
        CollectionsUtil.removeDuplicate(longs, DuplicateMark.getDuplicateMark());
        System.out.println(longs.toString());

        CollectionsUtil.filterByConditions(longs,i ->{
            if(i == 1) {
                return true;
            }
            return false;
        });
        System.out.println(longs.toString());

        List aa = Lists.newArrayList();
        BidTenderDto dto = new BidTenderDto();
        dto.setUserId(111L);
        aa.add(dto);

        BidTenderDto dto2 = new BidTenderDto();
        dto2.setUserId(112L);
        aa.add(dto2);

        BidTenderDto dto3 = new BidTenderDto();
        dto3.setUserId(111L);
        aa.add(dto3);

//        CollectionsUtil.removeDuplicate(aa, (BidTenderDto d) ->{
//            return d.getUserId();
//        });
//        System.out.println(aa.toString());
        CollectionsUtil.filterByConditions(aa, (BidTenderDto d) ->{
            if(d.getUserId().longValue() == 112L) {
                return true;
            }
            return false;
        });
        System.out.println(aa.toString());

        List source = Lists.newArrayList();
        source.add(1);
        source.add(2);
        source.add(3);
        source.add(1);
        source.add(3);
        CollectionsUtil.removeDuplicate(source,longs, DuplicateMark.getDuplicateMark());
        System.out.println(source.toString());
    }

}




package com.lb.seller.util;

/**
 *       
 * @author lb [email protected]
 * @date 2019-1-18 0018 14:27
 */
public interface DuplicateMark {

    E getDuplicateMark(T t);

    static  DuplicateMark getDuplicateMark(){
        return t ->t;
    }

}


package com.lb.seller.util;


/**
 *        
 * @author lb [email protected]
 * @date 2019-1-18 0018 14:27
 */
public interface CollectionsConditions {

    boolean filter(T t);

}

上は私の完全なコードで、コードの中には重さを取り除くことを含んで、条件によってフィルタリングすることを含んで、またソースの集合は別の集合の中で重複する値などの方法の機能があってはいけなくて、もし分からないならば、あるいはどこが書いたのが間違って、伝言あるいはメールボックスを送ることができます[email protected]