如何遍历HasMap的键,其中键遵循某种结构?

时间:2018-02-02 09:19:32

标签: java loops hashmap

我有一个HashMap pdf = new HashMap<String, String>(),其密钥遵循某种惯例:

PilotFirstname Bob
PilotName Jones
PilotDOB 12/12/2001
PilotAddress 123 Any Street
CopilotFirstname Jim
CoPilotName Jones
CopilotDOB 13/02/1997
CoPilotAddress 456 Any Street

注意密钥是如何形成为<role><property>的。每个人都有角色前缀,每个人(姓名,名字,DOB,地址)有4个详细信息可以进入POJO。前缀是Pilot,CoPilot,CabinCrew1到6。

我开始编写代码。这些字段来自PDF:

List fields = new ArrayList(); // list to store PDF fields
fields = acroForm.getFields(); // Get PDF fields
Iterator fieldsIter = fields.iterator(); // Iterator for the fields
// Create Hashmap "pdf" storing PDF field names & values
pdf = new HashMap<String, String>();
while (fieldsIter.hasNext()) {
        PDField field = (PDField) fieldsIter.next();
        // Next line removes braces for dropdowns and any leading whitespace
        pdf.put(field.getPartialName(), field.getValueAsString().replaceAll("[\\[\\]]", "").trim());
}

    public void createPerson(Map<String, String> pdf, String role) {
    Person person = new Person();
    person.setLastName(pdf.get(role +"Name"));
    person.setFirstName(pdf.get(role +"FirstName"));
    person.setAddress(pdf.get(role +"Address"));
    person.setDateOfBirth(pdf.get(role +"DOB"));
    System.out.println("Stop");
}

什么是在hashmap中循环遍历每个人的最佳方式(需要识别前缀(角色))。

我需要将每个人的详细信息提取到一个人POJO中,每个角色一个POJO。

如何处理?我应该遍历Hashmap,寻找以&#34; Name&#34;结尾的字段。然后在hashmap中搜索具有相同前缀的其他四个字段之一?

环境是Java 7。

1 个答案:

答案 0 :(得分:0)

这可以作为基于每个角色提取属性的起点:

import java.util.*;
import java.util.stream.*;

public class MyClass {

    public static class Pojo {
        public Pojo(String property1, String property2) { }
    }

    public static void main(String args[]) {

        Map<String, String> myMap = new HashMap<>();
        myMap.put("role1property1", "a");
        myMap.put("role1property2", "b");
        myMap.put("role2property1", "c");
        myMap.put("role2property2", "d");

        List<String> roles = myMap.keySet().stream()
            .filter(s -> s.endsWith("property1"))
            .map(s -> s.substring(0, s.indexOf("property1")))
            .collect(Collectors.toList());

        for (String role: roles)
        {
            // do something with it
            String a = myMap.get(role + "property1");
            String b = myMap.get(role + "property2");
        }

        // or

        List<Pojo> pojos = roles.stream()
            .map(role -> new Pojo(myMap.get(role + "property1"), myMap.get(role + "property2")))
            .collect(Collectors.toList());
    }
}