Сравнение Hashmap для загрузки данных в Excel - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть эти 4 хеш-карты и я использую их в коде, чтобы я мог показать сравнение в листе Excel.

HashMap 1 - с ключом с уникальным идентификатором и значением в качестве другого хеш-карты, содержащего 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, и значением в качестве другого хэш-карты, содержащего tagid в качестве ключа и значение описания, используемого в Hashmap 1.

[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 столбцах.

alt text

Ответы [ 2 ]

2 голосов
/ 25 ноября 2010

Итак, у вас есть два набора хэш-карт, которые вы хотите сравнить в файле Excel, и оба набора могут содержать или не содержать одинаковую информацию ... (и давайте предположим, что, если они имеют одинаковую информацию, они могут иметь или не иметь имеют одинаковые ключи на картах)

Я не уверен, что понимаю, в чем именно проблема, которую вы застряли, но вот как я бы быстро это сделал.

У меня был бы небольшой класс, содержащий метку строки (например, «Функции плана») и содержащие значения обеих карт, которые вы хотите сравнить (например, valA, valB), что-то вроде этого:

class ThisIsARow {
    String label, valA, valB;
}

Я бы объединил оба набора хеш-карт в получившийся HashMap<String, ThisIsARow>, для которого ключом была бы сама метка.

Затем я бы перебрал первый набор хеш-карт, создав новые экземпляры ThisIsARow, установив их значения label и valA для каждого.

Тогда я бы перебрал второй набор хеш-карт, сначала посмотрев, есть ли уже в экземпляре ThisIsARow в результирующем HashMap<String, ThisIsARow> для каждой метки, создав и добавив новый (установив его метку и valB), если его еще нет для этой метки или просто установите valB существующего экземпляра ThisIsARow.

Тогда я бы использовал Apache POI , чтобы записать все в файл Excel. (Тогда вам нужно будет только пройти через получившуюся хэш-карту, печатая один экземпляр ThisIsARow на строку.)

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

Надеюсь, это поможет. Дайте мне знать, если вам нужны разъяснения или я не в курсе!

2 голосов
/ 17 ноября 2010

Сначала я бы предложил вам нормализовать субоптимальное представление данных примерно так, как показано ниже. Тогда вам просто нужно поддерживать две карты. Затем легко перемещаться между ними и отображать их так, как вы хотите.

Если вы можете использовать библиотеку google-guava , тогда еще проще сгруппировать данные по идентификатору с помощью Multiset.

Ниже приведены подробные сведения о моем подходе. Вы можете использовать возвращаемый тип «reportBuilder.build (plan1, plan2)» и использовать Apache POI, как это было предложено другими, для создания Excel

  • Перевозчик предлагает 1 или более планов
  • Каждый план имеет и id и 1 или более функций
  • Каждая функция имеет идентификатор, расшифровку, значение

    публичный класс Main { приватная статическая карта> plan1Map;

    частная статическая карта> plan1AdditionalDetailsMap;

    приватная статическая карта> plan2Map;

    приватная статическая карта> plan2AdditionalDetailsMap;

    частный статический план plan1;

    частный статический план plan2;

    public static void main (конечные аргументы String []) { initiaizeData (); normalizeData (); System.out.println (плана1); System.out.println (plan2); PlanComaprisionReportBuilder reportBuilder = new PlanComaprisionReportBuilder (); System.out.println (reportBuilder.build (plan1, plan2)); }

    закрытая статическая пустота 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)
    

    { Строка 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();
    
    
    <pre><code>String tagId = entry.getKey();
    String tagDescription = entry.getValue();
    String tagValue = additionalDetails.get(tagId);
    
    
    plan.addFeature(new Feature(tagId, tagDescription, tagValue));
    
    } план возврата;

    }

    закрытая статическая пустота initiaizeData () { plan1Map = Maps.newHashMap (); Map map1Value = Maps.newTreeMap (); map1Value.put ("id_1", "Функции плана"); map1Value.put ("a", "Франшиза"); map1Value.put ("b", "Individual"); map1Value.put ("c", "Family"); map1Value.put ("id_4", "Индивидуальный выход из сети"); map1Value.put ("id_2", "Годовой максимум в кармане"); map1Value.put ("d", "Individual"); map1Value.put ("e", "Family"); map1Value.put ("u", "Максимум времени жизни"); 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);
    

    } }

План общественного класса { приватный финал String 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;
    }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...