これらのオブジェクトをすべてMap<String, ProductDetails>
に入れて、最新のバージョンに保つことができます。その後
List<ProductDetails> details = Arrays.asList(
new ProductDetails("ios", "9.1.0"),
new ProductDetails("android", "6.0.1"),
new ProductDetails("android", "5.1.1"),
new ProductDetails("ios", "10.0.0"));
// get part of version string
Function<Integer, Function<ProductDetails, Integer>> version =
n -> (pd -> Integer.valueOf(pd.getProductVersion().split("\\.")[n]));
// chain to comparator
Comparator<ProductDetails> versionComp = Comparator.comparing(version.apply(0))
.thenComparing(version.apply(1)).thenComparing(version.apply(2));
Map<String, ProductDetails> latest = new HashMap<>();
for (ProductDetails pd : details) {
String name = pd.getProductName();
if (! latest.containsKey(name) || versionComp.compare(latest.get(name), pd) < 0) {
latest.put(name, pd);
}
}
、latest
は次のとおりです。
{android=Sandbox.ProductDetails(productName=android, productVersion=6.0.1),
ios=Sandbox.ProductDetails(productName=ios, productVersion=10.0.0)}
それとも、あなたはCollectors.groupingBy
を使用して、同じComparator
を使用することができます。
details.stream()
.collect(Collectors.groupingBy(ProductDetails::getProductName))
.values().stream().map(list -> Collections.max(list, versionComp))
.forEach(System.out::println);
1)製品のバージョンがlongに変換します。 2)productNameでソート、productVersionLongで降順。 3)各商品名の最初の行を保持します。 4)利益! –
これはまったくソートする必要はありません。マップを使用するだけです。最もトリッキーなビットは、バージョン番号を適切に比較します。 –
あなたの入力をいただきありがとうございます。私はリストをソートしたくありません。私はあなたのアプローチを試してみます –