如何使用java流api在hashmap中存储具有相同键的值(逗号分隔)?

iyr7buue  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(415)

我有一个名为entityobjectd的对象,如下所示:

public @Data class EntityObjectDTO  {
     @JsonInclude(JsonInclude.Include.NON_NULL)
     @JsonIgnoreProperties(ignoreUnknown = true)
     @Data
     public static class Attributes {

         private String name;

         private AttributeType attributeType;

         private String dataType;

     }
}

此attributetype是枚举,可以有值(原始、引用、原始)。我正在尝试将所有属性名称和数据类型存储到字符串键和值的hashmap中。此数据类型也可以重复。
输入:

EntityObjectDTO  obj= new EntityObjectDTO ();
    obj.getAttributes().setName("name1");
    obj.getAttributes().setAttributeType(REFERRED);
    obj.getAttributes().setDataType("Vehicle");

    obj.getAttributes().setName("name2");
    obj.getAttributes().setAttributeType(REFERRED);
    obj.getAttributes().setDataType("Vehicle");

    obj.getAttributes().setName("name3");
    obj.getAttributes().setAttributeType(REFERRED);
    obj.getAttributes().setDataType("Person");

hashmap中需要:
{“车辆”,“名称1,名称2”}
{“人”,“名字3”}
这就是我所尝试的:

Map<String, String> myMap = obj.getAttributes().stream()
            .filter(entity -> AttributeType.REFERRED.equals(entity.getAttributeType()))
            .collect(Collectors.toMap(EntityObjectDTO.Attributes::getDataType, e -> e.getName()));<br/>

但是这样我就得到了:java.lang.illegalstateexception:消息:duplicate key vehicle(尝试合并值name1和name2)
如何通过对现有代码进行一些修改来实现预期的输出?

hmae6n7t

hmae6n7t1#

我想你的 EntityObjectDTO 如下所示,

public class EntityObjectDTO {

    private Attributes attributes;

    public Attributes getAttributes() {
        return attributes;
    }

    public void setAttributes(Attributes attributes) {
        this.attributes = attributes;
    }
}

以及 Attributes 如下所示,

public class Attributes {
    private String name;
    private String dataType;
    private AttributeType attributeType;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDataType() {
        return dataType;
    }

    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    public AttributeType getAttributeType() {
        return attributeType;
    }

    public void setAttributeType(AttributeType attributeType) {
        this.attributeType = attributeType;
    }
}

那么下面的就可以了,

public static void main(String[] args) {
            EntityObjectDTO obj= new EntityObjectDTO ();

            Attributes attributes = new Attributes();
            attributes.setName("name1");
            attributes.setDataType("Vehicle");
            attributes.setAttributeType(AttributeType.REFERRED);
            obj.setAttributes(attributes);

            Attributes attributes1 = new Attributes();
            attributes1.setName("name2");
            attributes1.setDataType("Vehicle");
            attributes1.setAttributeType(AttributeType.REFERRED);
            obj.setAttributes(attributes1);

            Attributes attributes2 = new Attributes();
            attributes2.setName("name3");
            attributes2.setDataType("Person");
            attributes2.setAttributeType(AttributeType.REFERRED);
            obj.setAttributes(attributes2);

            List<Attributes> list = List.of(attributes1, attributes2, attributes);

            Map<String, String> collect = list.stream()
                                              .filter(e -> AttributeType.REFERRED.equals(e.getAttributeType()))
                                              .collect(Collectors.groupingBy(Attributes::getDataType,
                                                      Collectors.mapping(Attributes::getName,
                                                              Collectors.joining(","))));

            System.out.println(collect);

}

请注意,我使用了单独的类。

n1bvdmb6

n1bvdmb62#

我知道,你的类entityobjectd需要一个属性集合(list),你没有像你提到的那样,我改变了它如下,得到了你需要的输出。
输出:{vehicle=name1,name2,person=name3}

public @Data class EntityObjectDTO  {
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown = true)
    private List<Attributes> attributes = new ArrayList<>();
}

@Data
public class Attributes {

    private String name;

    private AttributeType attributeType;

    private String dataType;

}

public class Main22 {

    public static void main(String[] args) {
        System.out.println("******************");
        EntityObjectDTO  obj= new EntityObjectDTO ();

        Attributes attributes = new Attributes();
        attributes.setName("name1");
        attributes.setAttributeType(REFERRED);
        attributes.setDataType("Vehicle");
        obj.getAttributes().add(attributes);

        attributes = new Attributes();
        attributes.setName("name2");
        attributes.setAttributeType(REFERRED);
        attributes.setDataType("Vehicle");
        obj.getAttributes().add(attributes);

        attributes = new Attributes();
        attributes.setName("name3");
        attributes.setAttributeType(REFERRED);
        attributes.setDataType("Person");
        obj.getAttributes().add(attributes);

        Map<String, String> myMap = new HashMap<>();
        for(Attributes att : obj.getAttributes()){
            if(myMap.containsKey(att.getDataType())) {
                myMap.put(att.getDataType(), myMap.get(att.getDataType())+","+att.getName());
            }else {
                myMap.put(att.getDataType(), att.getName());
            }
        }

        System.out.println(myMap);
    }
}

相关问题