これらがJava Beanクラスであると仮定します
class Camp {
int number;
User userId;
Date createDt;
}
class User {
private String id;
private String name;
}
Camp
同じuserIdを持っているがcreateDtが小さいタイプのarrayListからそれらのレコードを削除したい。
これがリストだとしましょう-
// ... the list is already populated
List<Camp> usersList = populatedListOfUser();
そしてこれが方法です-
private List<Camp> skipByComparison(List<Camp> usersList){
List<Camp> mainList = new ArrayList<Camp>();
Set<Camp> s = new TreeSet<Camp>(new Comparator<Camp>() {
@Override
public int compare(Camp o1, Camp o2) {
if(o1.getUserId().getId().equals(o2.getUserId().getId())) {
if(o1.getCreatedTs().compareTo(o2.getCreatedTs()) < 0) {
usersList.remove(o1);
return -1;
} else {
return 1;
}
} else {
return 0;
}
}
});
s.addAll(usersList);
mainList.addAll(s);
}
だから私が電話するとき-
usersList = skipByComparison(usersList);
Camp
同じuserIdを持っているがcreateDtが小さいタイプのarrayListからレコードを取得しません。
例のために。私は同じと2つのレコードを持っている場合Camp.getUser().getId()
が、record 1
持っているCreateDt
よりも大きいrecord 2
、私は削除しますrecord 2
。
次のようにコードを更新できます。
private List<Camp> skipByComparison(List<Camp> usersList){
Set<Camp> s = new TreeSet<>((o1, o2) -> o1.getUserId().getId().equals(o2.getUserId().getId()) ?
o1.getCreateDt().compareTo(o2.getCreateDt()) : 0);
s.addAll(usersList);
return new ArrayList<>(s);
}
またはCollectors
ストリームを使用してそれを解決するには、次のようにします:
private List<Camp> skipByComparisonStream(List<Camp> usersList) {
return new ArrayList<>(usersList.stream()
.collect(Collectors.toMap(c -> c.getUserId().getId(),
Function.identity(),
(a, b) -> a.getCreateDt().after(b.getCreateDt()) ? a : b))
.values());
}
説明:Comparator
現在、2つの日付が可能である場合、値は返されません。equal
おそらく、そのcompareTo
ためのDate
クラスの実装に依存する必要があります。
Set<Camp> s = new TreeSet<>(new Comparator<Camp>() {
@Override
public int compare(Camp o1, Camp o2) {
return o1.getUserId().getId().equals(o2.getUserId().getId())
? o1.getCreateDt().compareTo(o2.getCreateDt()) : 0;
}
});
これを行うと、ラムダ式を次のように使用して簡略化できます。
Set<Camp> s = new TreeSet<>((o1, o2) -> o1.getUserId().getId().equals(o2.getUserId().getId())
? o1.getCreateDt().compareTo(o2.getCreateDt()) : 0);
私が行った残りの変更は、実行順序を単純化し、冗長な初期化をクリーンアップすることでした。
余談ですが、別の質問で修正されました。代わりjava.time.LocalDate
にcreateDt
属性に使用することをお勧めします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加