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真的没什么区别。在另一节课上做了些别的。。我想我得好好编辑。