将不同类型的集迭代到用户定义的类型列表中

时间:2015-12-19 19:30:35

标签: java list generics set

我有不同类型的Sets,如下所示:

        Set<String> imgs = new LinkedHashSet<String>(this.getImages());

        Set<String> proNames = new LinkedHashSet<String>(this.getProductNames());

        Set<Integer> proQty = new LinkedHashSet<Integer>(this.getQty());

        Set<Double> proPrice = new LinkedHashSet<Double>(this.getPrices());

我需要将上述集合中的所有数据插入一个用户定义的类型ArrayList,如下所示:

List<MyProduct> pList = new ArrayList<MyProduct>();
        for (Iterator<Double> iterator = proPrice.iterator(); iterator.hasNext();) {
            Double next = iterator.next();
            pList.add(new MyProduct(?, ?, ?, next));
        }

考虑所有集合的大小相同。(所有4个集合包含相同数量的数据)

MyProduct上课:

public class MyProduct {

    private String image;
    private String proName;
    private int qty;
    private double price;


    public MyProduct(String image, String proName, int qty, double price) {
        this.image = image;
        this.proName = proName;
        this.qty = qty;
        this.price = price;
    }
      //getters and setters
       ...

提前致谢。

更新:

假设我有4个ArrayLists而不是Sets

public ArrayList<String> proNames = new ArrayList();
public ArrayList<Double> proPrice = new ArrayList();
public ArrayList<Integer> proQty = new ArrayList();
public ArrayList<String> imgs = new ArrayList<String>();

但是在这些列表中可能包含重复项。这意味着proNames有两个产品 Apple Banana 。但是proPrice我们有了 Apple Banana 的价格,但有重复的价格。

  

(例如:让我们假设 Apple - &gt; $ 1 Banana - &gt; $ 2 。   香蕉的proPrice - &gt; [1,2,2]价格两次。)。

所以在这种情况下如何将这些数据放在我的List<MyProduct> ??

2 个答案:

答案 0 :(得分:0)

我不知道你为什么要在第一时间将它们分开^ _ ^

但无论如何,正如你所说他们的长度都相同,那么只有一个声明就足够了。

List<MyProduct> pList = new List<MyProduct>();
for(int i = 0; i < imgs.Count; i++)
{
    pList.Add(new new MyProduct(imgs[i],proNames[i], proQty[i], proPrice[i]))
}

更新 :抱歉,我在c#中写了这个例子,没注意到你想要Java,但我想它很清楚

答案 1 :(得分:0)

通过组合各个组件集中的组件的相关部分来构造List MyProduct,其中不包含关于哪些元素相关的信息是不可能的。你怎么知道哪些组件与哪些组件一起使用?

理想的解决方案是不要将组件(imageproNameqtyprice)放入Set中,以便您可以避免破坏他们之间的关系。这当然会引发一个问题,即如何首先了解它们之间的关系。假设你有这样一种机制(如果你没有,那么这将无法解决),我将通过假设你可以编写像getImage(enumerator)这样的函数来抽象它,其中enumerator就像一个索引将一堆列表或密钥放入一堆Map中。我还假设您可以枚举Collection enumerators中的所有可能标识符。最后,如果您有重复项,我会假设您可以使用产品的某个字段(可能是proName)来确定某些内容是否重复。有了所有这些假设,您就可以构建一个独特的Set MyProduct,如下所示:

Map<String,MyProduct> uniqueProducts = new HashMap<>();
for(TypeOfEnumerator enumerator : enumerators){

    if(!uniqueProducts.contains(getProName(enumerator))){
        //You've stated a requirement that you avoid duplication
        //before you even create a duplicate MyProduct. This if
        //before the construction meets that requirement.
        uniqueProducts.put(getProName(enumerator),
            new MyProduct(getImg(enumerator),getProName(enumerator),getQty(enumerator),getPrice(enumerator)));
    }
}

然后,如果您希望最终结果为Set而不是Map

Set<MyProduct> products = new HashSet<MyProduct>(uniqueProducts.values());

注意:为了清楚起见,只要组件位于getImage(enumerator),您就无法创建Sets等方法。我的解决方案假设您将imageqty等等以的形式保留,然后再将它们放入集合中以删除重复项。它使用Mapcontains检查来管理避免重复。

更新:您已编辑了问题,表示您现在正在List而不是Set中保留您的组件。在这种情况下,TypeOfEnumeratorint,我们可以将enumerator重命名为标准i,方法getImage(enumerator)变为imgs.get(i)。这使得上面的代码成为:

Map<String,MyProduct> uniqueProducts = new HashMap<>();
for(int i=0; i<proNames.size(); i++){

    if(!uniqueProducts.contains(proNames.get(i))){
        //You've stated a requirement that you avoid duplication
        //before you even create a duplicate MyProduct. This if
        //before the construction meets that requirement.
        uniqueProducts.put(proNames.get(i),
            new MyProduct(imgs.get(i),proNames.get(i),proQty.get(i),proPrice.get(i)));
    }
}

Set<MyProduct> products = new HashSet<MyProduct>(uniqueProducts.values());