代码之家  ›  专栏  ›  技术社区  ›  yogsma

比较hashmap以在Excel中下载数据

  •  0
  • yogsma  · 技术社区  · 14 年前

    我有这4个哈希图,并在代码中使用它们,这样我就可以在Excel工作表中显示比较结果。

    hashmap 1-具有唯一ID和值的键作为另一个hashmap,包含tagid作为键和要比较的字段描述。

    [343,((id_1,plan features),(a,reduce),(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相同的唯一ID的键,其值与另一个hashmap的值相同,后者包含在hashmap 1中使用的TagID作为键和描述值。

    [343,((id_1,“”),(a,calendar year),(b,5000),(c,10000)(id_415000),(id_2,“”),(d,5000),(e,10000),(u,“unlimited”))]
    < /代码> 
    
    

    hashmap 3和hashmap 4的情况也是如此

    [347,((id_1,plan features),(a,reduce),(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,日历年),(B,7000),(ID_5,9000),(C,12000),(ID_414000),(ID_2,“”),(D,6000),(E,15000),(U,“无限”)]
    < /代码> 
    
    

    我想在Excel工作表中显示比较,方法是在一列中显示所有描述,在另两列中显示各自的值。

    Excel工作表中的比较。

    hashmap 1-具有唯一ID和值的键作为另一个hashmap,包含tagid作为键和要比较的字段描述。

    [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相同的唯一ID的键,其值与另一个hashmap的值相同,后者包含在hashmap 1中使用的TagID作为键和描述值。

    [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工作表中显示比较,方法是在一列中显示所有描述,在另两列中显示各自的值。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Aravind Yarram    14 年前

    我首先建议您将次优数据表示规范化为如下所示。然后你只需要维护两张地图。然后很容易在它们之间迭代并以您想要的方式显示。

    如果你能用 google-guava 然后,使用multiset对库进行分组比使用id进行分组更容易。

    下面是我的方法的高级细节。您可以使用“reportbuilder.build(plan1,plan2)”的返回类型,并根据其他人的建议使用apache poi创建Excel。

    • 运营商提供一个或多个计划
    • 每个计划都有和ID以及1个或多个功能
    • 每个功能都有id、decsription和value

      公共类主 { 私有静态地图>计划1映射;

      私有静态地图>计划1其他详细信息地图;

      私人静态地图>计划2映射;

      私有静态地图>平面2其他详细信息地图;

      私人静态平面图1;

      私人静态平面图2;

      公共静态void main(final string[]args) { initiaizedata(); normalizedata(); system.out.println(计划1); system.out.println(计划2); plancomaprisonreportbuilder reportbuilder=新建plancomaprisonreportbuilder(); system.out.println(reportbuilder.build(plan1,plan2)); }

      私有静态void normalizedata()。 { plan1=建筑平面图(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));
      
      } return plan;

      }

      私有静态void initiazedata()。 { plan1Map=maps.newHashMap(); map1value=maps.newtreemap(); map1value.put(“id_1”,“plan features”); MAP1VALUE.PUT(“A”,“免赔额”); map1value.put(“b”,“个人”); map1value.put(“c”,“family”); map1value.put(“id_4”,“个人脱离网络”); map1value.put(“id_2”,“out-of-pocked annual maximum”); map1value.put(“d”,“个人”); map1value.put(“e”,“family”); map1value.put(“u”,“最长寿命”); 计划1资产净值(“343”,地图1价值);

      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);
      

      } }

    公共班级计划 { 私有最终字符串ID;

    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;
        }
       }
    
        2
  •  2
  •   Joanis    14 年前

    所以在一个Excel文件中有两组要比较的哈希图,两组数据中的信息可能相同,也可能不同…(假设他们有相同的信息,他们在地图中可能有或没有相同的键)

    我不确定我是否知道你到底遇到了什么问题,但下面是我如何快速解决的。

    我会用一个小类来保存行标签(“PlanFeatures”,例如),并保存要比较的两个映射的值(例如vala、valb),这样:

    class ThisIsARow {
        String label, valA, valB;
    }
    

    我将把这两组哈希图组合在一个结果中 HashMap<String, ThisIsARow> 对于它,键将是标签本身。

    然后,我将遍历第一组哈希图,创建thisisarow的新实例,为每个实例设置标签和vala值。

    然后,我将遍历第二组哈希映射,首先检查结果中是否已经有thisisarow实例 hashmap<string,thisisarow> 对于每个标签,如果该标签还没有新标签,则创建并添加一个新标签(设置其标签和值),否则只设置现有ThisisArrow实例的值。

    然后我会用 Apache POI 在Excel文件中写下所有内容。(然后,您只需遍历生成的哈希图,每行打印一个thisisarow实例。)

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

    我希望这有帮助。如果你需要澄清或我偏离轨道,请告诉我!

    推荐文章