你能假设最好或更隐秘的方式,把List<Product> allProducts转换成按ProductNumber分组的Map<Integer, List<Product>>产品吗?
例如,我的产品POJO。
public class Product{
..
private Integer productCode;
private String productName;
...
//getters, setters
}这是我的尝试,但我认为这并不是很容易做到的:
public Map<Integer, List<Product>> getProductsByIndex (List<Product> products){
Map<Integer, List<Product>> resultMap = new HashMap<>();
Set<Integer> productCodes = getProductCodes(products);
for(Integer productCode: productCodes){
List<Product> productsByCode = new ArrayList<>();
for(Product product : products){
if(productCode == product.getCode()){
productsByCode.add(product);
}
}
resultMap.put(productCode, productsByCode);
}
return resultMap;
}
public Set<Integer> getProductCodes (List<Product> products){
Set<Integer> productCodes = new HashSet<>();
for(Product product: products){
productCodes.add(product.getCode());
}
return productCodes;
}发布于 2013-12-19 13:35:48
您的解决方案不是线性的,对于大量的数据来说太慢了。只需使用简单的方法:
public Map<Integer, List<Product>> getProductsByIndex (List<Product> products){
Map<Integer, List<Product>> resultMap = new HashMap<>();
for(Product product: products){
List<Product> productsByCode = resultMap.get(product.getCode());
if (productsByCode == null) {
productByCode = new ArrayList();
resultMap.put(product.getCode(), productByCode);
}
productsByCode.add(product);
}
return resultMap;
}发布于 2013-12-19 13:30:32
Java 8解决方案:
Map<Integer, List<Product>> productsByCode = products.stream()
.collect(Collectors.groupingBy(Product::getProductCode));发布于 2013-12-19 13:29:34
for (Product p: products) {
List<Product> l = productsByCode.get(p.getCode());
if (l == null) {
l = new ArrayList<>();
productsByCode.put(p.getCode(), l);
}
l.add(p);
}这就是你所需要的:)
https://stackoverflow.com/questions/20682979
复制相似问题