JavaにおけるList集合のデリバリー
8978 ワード
オリジナルの文章、転載は出典を表示してください:https://blog.csdn.net/loubing1990/article/details/86682640
先例
コードを見る
リストで繰り返されるデータを削除すると、Setには重み付け機能があると思うかもしれませんが、Setは無秩序で、私たちが望む結果が重み付けされた後、順序が乱れてはいけないので、Setは使えません.どうしよう?私の最初の書き方はこうでした
このように書くと確かに問題が解決しますが、リストのいくつかの集合であればどうしますか?では、汎用型を使いましょう.コードを見てください.
ここまでは通用するでしょうが、数日後に私がコードを書いたとき、また同じニーズに遭遇しました.このときは簡単なリストやリストではありません.もし私がオブジェクトTenderを持っていたら.
しかし需要はこのようにして、Listの中で、Tenderの中のuserIdを通じて重くして、どのようにしますか?上の方法は使えないのではないでしょうか.では、方法を書き直します.
これで目の前の問題も解決しますが、対象はテンダーではないでしょうか?それともTenderのもう一つの属性に基づいて判断して重くしますか?それはまた書き直さなければなりませんか.
では、私たちはその中の法則を探して、抽出して、発見しましたか?今まで、見たのは2つの変化があって、1つはリストの中の要素で、1つは比較目標で、要素はまあで、汎用型でいいですが、比較目標は?
考えてみれば...
じゃあインタフェースで
インタフェースを定義します
コード中のTはインパラメータであり,Eはアウトパラメータである.
必要に応じてこのインタフェースを実現すればよいので,得られる脱重方法はこうである.
これで通用するかな...
では、私の完全なコードを見てみましょう.
上は私の完全なコードで、コードの中には重さを取り除くことを含んで、条件によってフィルタリングすることを含んで、またソースの集合は別の集合の中で重複する値などの方法の機能があってはいけなくて、もし分からないならば、あるいはどこが書いたのが間違って、伝言あるいはメールボックスを送ることができます[email protected]
先例
コードを見る
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]