【问题标题】:How to remove duplicate in list based on two custom objects如何根据两个自定义对象删除列表中的重复项
【发布时间】:2016-10-15 06:20:32
【问题描述】:

我有 ProductDetail 类,其中包含两个变量 productNameproductVersion。我需要根据最新的productVersion替换列表中的重复项。

例子:

class ProductDetails {
   string productName;
   string productVersion;
}
new ProductDetails("ios", "9.1.0")
new ProductDetails("android", "6.0.1")
new ProductDetails("android", "5.1.1")
new ProductDetails("ios", "10.0.0")

结果: 安卓 6.0.1 ios 10.0.0

提前致谢。

【问题讨论】:

  • 1) 将产品版本转换为长版本。 2) 按productName、productVersionLong 降序排列。 3) 保留每个产品名称的第一行。 4) 利润!!
  • 这根本不需要排序。只需使用地图。最棘手的一点是正确比较版本号。
  • 感谢您的意见。我不想对列表进行排序。我会试试你的方法 Gilbert Le Blanc
  • @RIACreate 会有所帮助,我希望这是您正在寻找的正确答案link

标签: java sorting collections duplicates


【解决方案1】:

这应该适合你:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;


public class ProductDetails {

private String productName;
private String productVersion;
private List<ProductDetails> productData = null;

public ProductDetails(String productName,String productVersion){
    this.productName = productName;
    this.productVersion = productVersion;
    if(productData == null) {
        productData = new ArrayList<ProductDetails>();
        adNewProduct(this);
    }
}

private void  adNewProduct(ProductDetails p){
    String[] s1 = p.productVersion.split(Pattern.quote("."));
    for (ProductDetails dpp: productData) {
        if (dpp.productName.equals(p.productName)) {
            int index = productData.indexOf(dpp);
            String[] s2 = dpp.productVersion.split(Pattern.quote("."));
            for(int i = 0; i < s1.length; i++) {
                int v1 = Integer.valueOf(s1[i]);
                int v2 = Integer.valueOf(s2[i]);

                if (v1 > v2) {
                    productData.set(index,p);
                    return;
                }
            }
        }
    }
    productData.add(p);
}


@Override  // you can modify it to how you want
public String toString(){
   
    String s = "";

    for (ProductDetails p: productData){
        s += "ProductName: " + p.productName + " ProductVersion: " + p.productVersion + "\n";
    }
    return s;
}


//the main method
public static void main(String[] args) {
    ProductDetails k = new ProductDetails("ios", "9.1.1");
    k.adNewProduct(new ProductDetails("android", "5.1.1"));
    k.adNewProduct(new ProductDetails("android", "6.0.1"));
    k.adNewProduct(new ProductDetails("ios", "10.0.0"));

    System.out.println(k);

    }

}

输出:

产品名称:ios ProductVersion:10.0.0

产品名称:安卓产品版本:6.0.1

【讨论】:

  • @tobias_k 并没有什么不同。在其他班级做其他事情..我想我必须好好编辑。
【解决方案2】:

您可以将所有这些对象放入Map&lt;String, ProductDetails&gt; 并保持最新版本。

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2019-08-09
    • 2012-04-27
    相关资源
    最近更新 更多