我有不同类型的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>
??
答案 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
,其中不包含关于哪些元素相关的信息是不可能的。你怎么知道哪些组件与哪些组件一起使用?
理想的解决方案是不要将组件(image
,proName
,qty
和price
)放入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
等方法。我的解决方案假设您将image
,qty
等等以的形式保留,然后再将它们放入集合中以删除重复项。它使用Map
和contains
检查来管理避免重复。
更新:您已编辑了问题,表示您现在正在List
而不是Set
中保留您的组件。在这种情况下,TypeOfEnumerator
为int
,我们可以将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());