你能帮我用ArrayList构建带有对象的Hashmap。
public class Store {
private int storeId;
private String storeName;
private int deliveryDays;
private List<String> servingZipCodes;
private StoreAddress storeAddress;
public Store() {
}
public Store(int storeId,String storeName,int deliveryDays,List<String> servingZipCodes,StoreAddress storeAddress){
this.storeId = storeId;
this.storeName=storeName;
this.deliveryDays=deliveryDays;
this.servingZipCodes=servingZipCodes;
this.storeAddress = storeAddress;
}
//getters and setters.
}
和StoreAddress类
public class StoreAddress {
private String streetAddress1;
private String streetAddress2;
private String streetAddress3;
private String city;
private String state;
private String postalCode;
private String country;
private String phone;
public StoreAddress() {
}
public StoreAddress(String streetAddress1, String streetAddress2, String streetAddress3, String city, String state, String postalCode, String country, String phone) {
this.streetAddress1 = streetAddress1;
this.streetAddress2 = streetAddress2;
this.streetAddress3 = streetAddress3;
this.city = city;
this.state = state;
this.postalCode = postalCode;
this.country = country;
this.phone = phone;
}
这是用于测试的Test类。
public class Test {
public static void main(String args[]){
List<Store> storeList=new ArrayList();
StoreAddress storeAddress1 = new StoreAddress("1500 Polaris Pkwy",null,null,"Columbus","OH","43240","US","9165452345");
StoreAddress storeAddress2 = new StoreAddress("160 Easton Town Center",null,null,"Columbus","OH","43240","US","9165452345");
storeList.add(new Store(1,"Store 1",7,new ArrayList<String>(Arrays.asList("43240","43241","43242")),storeAddress1));
storeList.add(new Store(2,"Store 2",7,new ArrayList<String>(Arrays.asList("43240","43082","43081")),storeAddress2));
Map<String,List<Store>> zipCodeStoreList = null;
storeList.forEach(store -> {
List<String> servingZipCodes = store.getServingZipCodes();
servingZipCodes.stream().filter(x -> x.matches(store.getStoreAddress().getPostalCode().substring(0,5))).map(x ->new HashMap<String, Object>(){{
put(x, store);
}});
});
虽然它可以在Java 7中使用,但在java 8中寻找解决方案。
Key: 43240, value: Store1 , Store2
Key: 43241, value: null
Key: 43242, value: null
Key: 43082, value: null
Key: 43081, value: null
答案 0 :(得分:1)
正如我所说,您应该首先考虑 ,而不是如何,然后问题很容易解决。然后你可以获得自描述代码,例如:
// v--- union all zip codes from stores
Stream<String> union = storeList.stream().map(Store::getServingZipCodes)
.flatMap(List::stream)
.distinct();
// v--- find out intersections between zip codes
Stream<String> intersection = union.filter(zip ->
storeList.stream().map(Store::getServingZipCodes)
.allMatch(it -> it.contains(zip))
);
// v--- create a Map simply from intersections
Map<String, List<Store>> result = intersection.collect(toMap(
Function.identity(),
unused -> storeList
));
assert result.get("43240") == [store1, store2];
assert result.get("others") == null;
答案 1 :(得分:0)
我首先使用给定的邮政编码过滤List
Store
的{{1}}。这个给定的邮政编码是变量名key
。然后,我使用密钥将生成的过滤器放入Map
变量zipCodeStoreList
。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
* @author blj0011
*/
public class Test
{
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
List<Store> storeList=new ArrayList();
StoreAddress storeAddress1 = new StoreAddress("1500 Polaris Pkwy",null,null,"Columbus","OH","43240","US","9165452345");
StoreAddress storeAddress2 = new StoreAddress("160 Easton Town Center",null,null,"Columbus","OH","43240","US","9165452345");
storeList.add(new Store(1,"Store 1",7,new ArrayList(Arrays.asList("43240","43241","43242")),storeAddress1));
storeList.add(new Store(2,"Store 2",7,new ArrayList(Arrays.asList("43240","43082","43081")),storeAddress2));
Map<String,List<Store>> zipCodeStoreList = new HashMap();
String key = "43241";//See if a Store associates with this zip code.
//Add the key and the results from filtering the storeList based on the key.
zipCodeStoreList.put(key, storeList.stream().filter(x -> x.getServingZipCodes().contains(key)).collect(Collectors.toList()));
//Print results
for(Map.Entry<String, List<Store>> entry : zipCodeStoreList.entrySet())
{
for(Store store : entry.getValue())
{
System.out.println("filter 1: " + entry.getKey() + " - " + store.getStoreName());
}
}
}
}
修改版本,其中列出了与特定邮政编码相关联的所有
Stores
。
删除强>
String key = "43081";
zipCodeStoreList.put(key, storeList.stream().filter(x -> x.getServingZipCodes().contains(key)).collect(Collectors.toList()));
替换为
//Add the zip code belong to at least one store plus a zip code that belongs to no store.
List<String> allZipCodes = new ArrayList(Arrays.asList("43240","43082","43081", "43240","43241","43242", "55555"));
for(String zipCode : allZipCodes)
{
zipCodeStoreList.put(zipCode, storeList.stream().filter(x -> x.getServingZipCodes().contains(zipCode)).collect(Collectors.toList()));
}