反映的独特的商品一览?

时间:2015-05-03 17:08:57

标签: java arrays list reflection

我正在寻找解决方案如何使用独特的产品制作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

结果: 独特产品清单

  1. 花生

  2. XXX

  3. goodie

  4. 如果产品列在总价

    列表中

2 个答案:

答案 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();
}