比较Hashmap在Excel中下载数据

我有这4个hashmaps,并在代码中使用它们,所以我可以在Excel表中显示比较。

HashMap 1 – 将唯一的id和value作为另一个包含tagid作为key和要比较的字段的描述的hashmap。

[343, ((id_1,Plan Features),(a, Deductible),(b,Individual),(c,Family),(id_4,Individual Out-of-network),(id_2, Out-of-pocket Annual Maximum),(d,Individual),(e,Family),(u, Life Time Maximum))] 

HashMap 2 – 使用与Hashmap 1相同的唯一标识的键,并将其作为另一个包含tagid作为Hashmap 1中使用的描述的键和值的HashMap。

 [343, ((id_1,""),(a, Calendar Year),(b,5000),(c,10000)(id_4,15000),(id_2,""),(d,5000),(e,10000),(u,"Unlimited"))] 

HashMap 3和HashMap 4也是如此

 [347, ((id_1,Plan Features),(a, Deductible),(b,Individual),(id_5, Individual Out-of-network),(c,Family),(id_4,Family Out-of-network),(id_2, Out-of-pocket Annual Maximum),(d,Individual),(e,Family),(u, Life Time Maximum))] [347, ((id_1,""),(a, Calendar Year),(b,7000),(id_5, 9000),(c,12000),(id_4,14000),(id_2, ""),(d,6000),(e,15000),(u, "Unlimited"))] 

我想通过显示一列中的所有描述和另外两列中的相应值来在Excel表格中显示比较。

替代文字

我首先build议你将你的次优数据表示规范化到下面的东西。 那么你只需要维护两个地图。 然后很容易在它们之间进行迭代,并以任何你想要的方式显示。

如果你可以使用google-guava库,那么使用Multiset通过id进行分组就更容易了。

以下是我的方法的高级细节。 您可以使用“reportBuilder.build(plan1,plan2)”的返回types,并使用别人build议的Apache POI创buildexcel

  • 运营商提供一个或多个计划
  • 每个计划有和ID和1个或更多的function
  • 每个特征都有id,decsription,value

    公共类Main {private static Map> plan1Map;

    私人静态地图> plan1AdditionalDetailsMap;

    私人静态地图> plan2Map;

    私人静态地图> plan2AdditionalDetailsMap;

    私人静态Plan plan1;

    私人静态平面图2;

    public static void main(final String [] args){initializationizeData(); normalizeData(); 的System.out.println(计划1); 的System.out.println(计划2); PlanComaprisReportBuilder reportBuilder = new PlanComaprisionReportBuilder(); System.out.println(reportBuilder.build(plan1,plan2)); }

    private static void normalizeData(){plan1 = buildPlan(plan1Map,plan1AdditionalDetailsMap);

     plan2 = buildPlan(plan2Map, plan2AdditionalDetailsMap); 

    }

     private static Plan buildPlan(final Map<String, Map<String, String>> planMap, final Map<String, Map<String, String>> planAdditionalDetailsMap) 

    {String planId = Iterables.getOnlyElement(planMap.keySet());

     Plan plan = new Plan(planId); Map<String, String> planDetails = planMap.get(planId); Iterator<Entry<String, String>> features = planDetails.entrySet().iterator(); Map<String, String> additionalDetails = planAdditionalDetailsMap.get(planId); while (features.hasNext()) { Entry<String, String> entry = features.next(); 
     String tagId = entry.getKey(); String tagDescription = entry.getValue(); String tagValue = additionalDetails.get(tagId); plan.addFeature(new Feature(tagId, tagDescription, tagValue)); 

    }
    退货计划;

    }

    private static void initiateizeData(){plan1Map = Maps.newHashMap(); Map1Value = Maps.newTreeMap(); map1Value.put(“id_1”,“Plan Features”); map1Value.put(“a”,“Deductible”); map1Value.put(“b”,“Individual”); map1Value.put(“c”,“Family”); map1Value.put(“id_4”,“Individual Out-of-network”); map1Value.put(“id_2”,“自付年度最大值”); map1Value.put(“d”,“Individual”); map1Value.put(“e”,“Family”); map1Value.put(“u”,“Life Time Maximum”); plan1Map.put(“343”,map1Value);

     plan1AdditionalDetailsMap = Maps.newHashMap(); Map<String, String> policy1ExtensionValue = Maps.newTreeMap(); policy1ExtensionValue.put("id_1", ""); policy1ExtensionValue.put("a", "Calendar Year"); policy1ExtensionValue.put("b", "5000"); policy1ExtensionValue.put("c", "10000"); policy1ExtensionValue.put("id_4", "15000"); policy1ExtensionValue.put("id_2", ""); policy1ExtensionValue.put("d", "5000"); policy1ExtensionValue.put("e", "10000"); policy1ExtensionValue.put("u", "Unlimited"); plan1AdditionalDetailsMap.put("343", policy1ExtensionValue); plan2Map = Maps.newHashMap(); Map<String, String> policy2Value = Maps.newTreeMap(); policy2Value.put("id_1", "Plan Features"); policy2Value.put("a", "Deductible"); policy2Value.put("b", "Individual"); policy2Value.put("id_5", "Individual Out-of-network"); policy2Value.put("c", "Family"); policy2Value.put("id_4", "Family Out-of-network"); policy2Value.put("id_2", "Out-of-pocket Annual Maximum"); policy2Value.put("d", "Individual"); policy2Value.put("e", "Family"); policy2Value.put("u", "Life Time Maximum"); plan2Map.put("347", policy2Value); plan2AdditionalDetailsMap = Maps.newHashMap(); Map<String, String> policy2ExtensionValue = Maps.newTreeMap(); policy2ExtensionValue.put("id_1", ""); policy2ExtensionValue.put("a", "Calendar Year"); policy2ExtensionValue.put("b", "7000"); policy2ExtensionValue.put("id_5", "9000"); policy2ExtensionValue.put("c", "12000"); policy2ExtensionValue.put("id_4", "14000"); policy2ExtensionValue.put("id_2", ""); policy2ExtensionValue.put("d", "6000"); policy2ExtensionValue.put("e", "15000"); policy2ExtensionValue.put("u", "Unlimited"); plan2AdditionalDetailsMap.put("347", policy2ExtensionValue); 

    }}

公共类计划{私人最终stringID;

 private final Set<Feature> features = Sets.newHashSet(); public Plan(final String id) { this.id = id; } public String getId() { return id; } public void addFeature(final Feature f) { features.add(f); } public Set<Feature> getFeatures() { return Collections.unmodifiableSet(features); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } Plan other = (Plan) obj; if (id == null) { if (other.id != null) { return false; } } else if (!id.equals(other.id)) { return false; } return true; } @Override public String toString() { return "Plan [features=" + features + ", id=" + id + "]"; } 

}

  public class Feature { private final String id; private final String description; private final String value; public Feature(final String id, final String description, final String value) { this.id = id; this.description = description; this.value = value; } public String getId() { return id; } public String getDescription() { return description; } public String getValue() { return value; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } Feature other = (Feature) obj; if (id == null) { if (other.id != null) { return false; } } else if (!id.equals(other.id)) { return false; } return true; } @Override public String toString() { return "Attribute [description=" + description + ", id=" + id + ", value=" + value + "]"; } } public class PlanComaprisionReportBuilder { Multimap<String, String> build(final Plan... plans) { Multimap<String, String> rows = ArrayListMultimap.create(100, plans.length); for (Plan p : plans) { for (Feature f : p.getFeatures()) { rows.put(f.getDescription(), f.getValue() != null ? f.getValue() : ""); // if (!rows.containsKey(f.getDescription())) // { // } // else // { // existing row needs separate handling // } } } return rows; } } 

所以你需要在excel文件中比较两组哈希表,并且这两个集合可能有或者可能没有相同的信息(假设它们具有相同的信息,它们可能有或没有相同的信息键在地图中)

我不确定我究竟遇到了什么问题,但这里是我如何快速解决这个问题。

我会有一个小的类,它包含行标签(例如“Plan Features”),并且保存两个要比较的地图的值(例如valA,valB),所以像这样:

 class ThisIsARow { String label, valA, valB; } 

我将在一个HashMap<String, ThisIsARow>中将这两个hashmaps结合起来,这个key就是标签本身。

然后,我将循环遍历第一组hashasps,创buildThisIsARow的新实例,为它们设置标签和valA值。

然后我将遍历第二组hashasps,首先查看是否在每个标签的结果HashMap<String, ThisIsARow>已经存在一个ThisIsARow实例,如果还没有,则创build并添加一个新的实例(设置它的标签和valB)对于这个标签,或者只是设置现有的ThisIsARow实例的valB。

然后,我将使用Apache POI将所有内容写入Excel文件。 (然后,您只需循环遍历所生成的散列映射,每行打印一个ThisIsARow实例。)

 label valA valB label valA valB label valA valB label valA valB ... 

我希望这有帮助。 让我知道,如果你需要澄清,或者如果我偏离轨道!