Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何基于两个自定义对象删除列表中的重复项_Java_Sorting_Collections_Duplicates - Fatal编程技术网

Java 如何基于两个自定义对象删除列表中的重复项

Java 如何基于两个自定义对象删除列表中的重复项,java,sorting,collections,duplicates,Java,Sorting,Collections,Duplicates,我有一个ProductDetail类,它包含两个变量productName和productVersion。我需要根据最新的productVersion替换列表中的重复项 例如: class ProductDetails { string productName; string productVersion; } new ProductDetails("ios", "9.1.0") new ProductDetails("android", "6.0.1") new ProductDe

我有一个
ProductDetail
类,它包含两个变量
productName
productVersion
。我需要根据最新的
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


提前谢谢

您可以将所有这些对象放入
地图
,并保留最新版本的地图

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);
    }
}
或者,您可以使用
收集器。分组方式
,然后使用相同的
比较器

details.stream()
        .collect(Collectors.groupingBy(ProductDetails::getProductName))
        .values().stream().map(list -> Collections.max(list, versionComp))
        .forEach(System.out::println);

您可以将所有这些对象放入
地图
,并保留最新版本的地图

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);
    }
}
或者,您可以使用
收集器。分组方式
,然后使用相同的
比较器

details.stream()
        .collect(Collectors.groupingBy(ProductDetails::getProductName))
        .values().stream().map(list -> Collections.max(list, versionComp))
        .forEach(System.out::println);

这应该适合你:

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

    }

}
import java.util.ArrayList;
导入java.util.List;
导入java.util.regex.Pattern;
公共类产品详细信息{
私有字符串产品名称;
私有字符串版本;
私有列表productData=null;
公共产品详细信息(String productName、String productVersion){
this.productName=productName;
this.productVersion=productVersion;
if(productData==null){
productData=new ArrayList();
adNewProduct(本);
}
}
私有void adNewProduct(产品详细信息p){
字符串[]s1=p.productVersion.split(Pattern.quote(“.”);
for(ProductDetails dpp:productData){
如果(dpp.productName.equals(p.productName)){
int index=productData.indexOf(dpp);
字符串[]s2=dpp.productVersion.split(Pattern.quote(“.”);
对于(int i=0;iv2){
productData.set(索引,p);
回来
}
}
}
}
productData.add(p);
}
@覆盖//您可以根据需要对其进行修改
公共字符串toString(){
字符串s=“”;
对于(ProductDetails p:productData){
s+=“产品名称:”+p.ProductName+“产品版本:”+p.ProductVersion+“\n”;
}
返回s;
}
//主要方法
公共静态void main(字符串[]args){
ProductDetails k=新的ProductDetails(“ios”,“9.1.1”);
k、 adNewProduct(新产品详细信息(“安卓”、“5.1.1”));
k、 adNewProduct(新产品详细信息(“android”、“6.0.1”));
k、 adNewProduct(新产品详细信息(“ios”、“10.0.0”));
系统输出println(k);
}
}
输出:

产品名称:ios产品版本:10.0.0

产品名称:android产品版本:6.0.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);

    }

}
import java.util.ArrayList;
导入java.util.List;
导入java.util.regex.Pattern;
公共类产品详细信息{
私有字符串产品名称;
私有字符串版本;
私有列表productData=null;
公共产品详细信息(String productName、String productVersion){
this.productName=productName;
this.productVersion=productVersion;
if(productData==null){
productData=new ArrayList();
adNewProduct(本);
}
}
私有void adNewProduct(产品详细信息p){
字符串[]s1=p.productVersion.split(Pattern.quote(“.”);
for(ProductDetails dpp:productData){
如果(dpp.productName.equals(p.productName)){
int index=productData.indexOf(dpp);
字符串[]s2=dpp.productVersion.split(Pattern.quote(“.”);
对于(int i=0;iv2){
productData.set(索引,p);
回来
}
}
}
}
productData.add(p);
}
@覆盖//您可以根据需要对其进行修改
公共字符串toString(){
字符串s=“”;
对于(ProductDetails p:productData){
s+=“产品名称:”+p.ProductName+“产品版本:”+p.ProductVersion+“\n”;
}
返回s;
}
//主要方法
公共静态void main(字符串[]args){
ProductDetails k=新的ProductDetails(“ios”,“9.1.1”);
k、 adNewProduct(新产品详细信息(“安卓”、“5.1.1”));
k、 adNewProduct(新产品详细信息(“android”、“6.0.1”));
k、 adNewProduct(新产品详细信息(“ios”、“10.0.0”));
系统输出println(k);
}
}
输出:

产品名称:ios产品版本:10.0.0

产品名称:android产品版本:6.0.1


1) 将产品版本转换为长版本。2) 按产品名称排序,productVersionLong降序。3) 保留每个产品名称的第一行。4) 利润!!这根本不需要排序。用地图就行了。最棘手的一点是正确比较版本号。谢谢大家的意见。我不想对列表进行排序。我会试试你的方法,吉尔伯特·勒Blanc@RIACreate这会有帮助吗?我希望这是您想要的正确答案1)将产品版本转换为长期版本。2) 按产品名称排序,productVersionLong降序。3) 保留每个产品名称的第一行。4) 利润!!这根本不需要排序。用地图就行了。最棘手的一点是正确比较版本号。谢谢大家的意见。我不想对列表进行排序。我会试试你的方法,吉尔伯特·勒Blanc@RIACreate这会有帮助吗?我希望这是你要找的正确答案@tobias_k不会真的有什么不同。在另一节课上做了些别的。。我想我必须好好编辑。@tobias_k真的没什么区别。在另一节课上做了些别的。。我想我得好好编辑。