我正在寻找解决方案如何使用独特的产品制作List(或其他东西)。我想要这样做的原因是产品的总价格。每套可以包含相同的产品。
这是我的课程。
public class Product {
public String name; // unique name
public double price;
public double qty;
}
&安培;
public class Sets {
public Product item1;
public Product item2;
...
public Product item7;
public static listsProduct<Product> = new Arraylists<Product>();
}
我正在尝试制作一个列表,但我不知道如何添加一个独特的产品。要添加产品,请使用反射。
我的方法:
public void getProducts() throws NoSuchMethodException, Exception {
Sets object = this;
Class clazz = object.getClass();
Field[] fields = clazz.getFields();
Method m1 = Product.class.getMethod("getname", null);
for (Field field : fields) {
if(field.get(object)!=null) {
System.out.println(field.getName()+" = " + m1.invoke(field.get(object),null));
Product e=(Product) field.get(object);
if (listsProduct==null ) listsProduct.add((Produkt) field.get(object));
if (!(listsProduct.contains(field.get(object)))) listsProduct.add(e);
}
}
它正确地添加了一个产品但是如何制作UNIQUE列表?
提前感谢您的帮助!
编辑: 那么......你想要达到什么目的? 例如
设置:
1)黄油,牛奶,花生2)goodie,butter,xxx
3)牛奶,花生,xxx结果: 独特产品清单
脂
乳
花生
XXX
goodie
如果产品列在总价
列表中答案 0 :(得分:0)
我仍然不明白为什么你要使用反射,我给出了以下答案来解决你的问题how to store unique products ?
如果您想添加独特的产品。你必须定义什么使产品独特?让我们假设产品名称将帮助您确定它们是否不相等/唯一。
要定义它,我们在产品类
中编写equals&amp; hashcode方法public class Product {
public String name; // unique name
public double price;
public double qty;
public boolean equals(Object obj){
if (obj ==null || ! obj instanceOf Prpduct) return false;
else return ((Product) obj).name.equals(name);// also write a null check conditions for name field.
}
public interest hashCode(){
return name.hashCode();
}
}
现在将数据结构从List更改为Set 这将只存储不同的产品,如下所示 `
public class Sets {
public Product item1;
public Product item2;
...
public Product item7;
public static Set<Product> productSet= new HashSet<Product>();
}
` 有了这个,每当你添加productSet时,只会存储唯一的。
答案 1 :(得分:0)
您不需要使用Reflection API来做这样的事情!
获取唯一产品列表的一种方法是使用Map::merge
产品名称作为键和 Product :: merge 此示例中的方法为重新映射函数。
鉴于课程产品 ...
public class Product {
String name;
double price;
int qty;
public Product(String name, double price, int qty) {
this.name = name; this.price = price; this.qty = qty;
}
public Product merge(Product p) {
price += p.price;
qty += p.qty;
return this;
}
@Override
public String toString() {
return String.format("%s x %d (%.2f)", name, qty, price);
}
}
产品的集的列表 :
List<Set<Product>> sets = asList(
new HashSet<>(asList(new Product("cheese", 5, 1), new Product("milk", 3, 3))),
new HashSet<>(asList(new Product("peanut", 1, 1), new Product("bread", 2, 1))),
new HashSet<>(asList(new Product("cheese", 5, 1), new Product("peanut", 1, 1)))
);
可以像这样创建唯一产品的集合:
private static Collection<Product> listProducts(List<Set<Product>> sets) {
Map<String, Product> uniques = new HashMap<>();
for(Set<Product> set : sets)
for(Product p : set)
uniques.merge(p.name, p, (a, b) -> a.merge(b));
return uniques.values();
}
完整的工作示例:
import static java.util.Arrays.*;
import java.util.*;
public class UniqProd {
public static class Product {
String name;
double price;
int qty;
public Product(String name, double price, int qty) {
this.name = name;
this.price = price;
this.qty = qty;
}
public Product merge(Product p) {
price += p.price;
qty += p.qty;
return this;
}
@Override
public String toString() {
return String.format("%s x %d (%.2f)", name, qty, price);
}
}
public static void main(String[] args) {
List<Set<Product>> sets = asList(
new HashSet<>(asList(new Product("cheese", 5, 1), new Product("milk", 3, 3))),
new HashSet<>(asList(new Product("peanut", 1, 1), new Product("bread", 2, 1))),
new HashSet<>(asList(new Product("cheese", 5, 1), new Product("peanut", 1, 1)))
);
listProducts(sets).forEach(System.out::println);
}
private static Collection<Product> listProducts(List<Set<Product>> sets) {
Map<String, Product> uniques = new HashMap<>();
for (Set<Product> set : sets)
for (Product p : set)
uniques.merge(p.name, p, (a, b) -> a.merge(b));
return uniques.values();
}
}
如果由于某种原因,您必须/想要使用您的Sets类而不是java.util.Set,请在迭代之前构建Sets实例中的产品列表:
private static Collection<Product> listProducts(List<Sets> sets) {
Map<String, Product> uniques = new HashMap<>();
for (Sets set : sets)
for (Product p : asList(set.item1, set.item2, set.item3))
uniques.merge(p.name, p, (a, b) -> a.merge(b));
return uniques.values();
}