List collection merges similar items based on the same attributes

scenes to be used:

During development, we encountered a need for data verification of imported Excel data, but the data verification prompts of the same column may only be different in the number of rows, and the others are the same. Because our data verification prompts are all put in the message In the box, for the convenience of reading, it is necessary to merge similar items with the same type of verification information.

Processing logic:

1. Define the verification information class

Need to rewrite the equals into the hashcode method, define the merge method (the logic of merging: I am here to splice the number of rows)

import lombok.Data;

@Data
public class VerifyMessage {
    private String sheetName;
    private String columnName;
    private String rowNum;
    private Integer verifyType;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((sheetName == null) ? 0 : sheetName.hashCode());
        result = prime * result + ((columnName == null) ? 0 : columnName.hashCode());
        result = prime * result + ((verifyType == null) ? 0 : verifyType.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;

        VerifyMessage other = (VerifyMessage) obj;
        if (sheetName == null) {
            if (other.sheetName != null)
                return false;
        } else if (!sheetName.equals(other.sheetName))
            return false;

        if (columnName == null) {
            if (other.columnName != null)
                return false;
        } else if (!columnName.equals(other.columnName))
            return false;

        if (verifyType == null) {
            if (other.verifyType != null)
                return false;
        } else if (!verifyType.equals(other.verifyType))
            return false;
        return true;
    }

    static VerifyMessage merge(VerifyMessage m1, VerifyMessage m2) {
        if (!m1.equals(m2)) {
            throw new IllegalArgumentException();
        }
        return new VerifyMessage(m1.sheetName, m1.columnName, m1.rowNum + "," + m2.rowNum, m1.verifyType);
    }

    @Override
    public String toString() {
        return "VerifyMessage{" +
                "sheetName='" + sheetName + '\'' +
                ", columnName='" + columnName + '\'' +
                ", rowNum='" + rowNum + '\'' +
                ", verifyType=" + verifyType +
                '}';
    }

    public VerifyMessage(String sheetName, String columnName, String rowNum, Integer verifyType) {
        this.sheetName = sheetName;
        this.columnName = columnName;
        this.rowNum = rowNum;
        this.verifyType = verifyType;
    }
}

2. Create a test class 

public static void main(String[] args) {
    List<VerifyMessage> verifyMessageList = new ArrayList<>();
    verifyMessageList.add(new VerifyMessage("Schedule and target import","Schedule time","1",SZGS.num));
    verifyMessageList.add(new VerifyMessage("Schedule and target import","Schedule time","3",SZGS.num));
    verifyMessageList.add(new VerifyMessage("Schedule and target import","Schedule time","7",SZGS.num));
    verifyMessageList.add(new VerifyMessage("Schedule and target import","Schedule time","9",SZGS.num));
    verifyMessageList.add(new VerifyMessage("Personnel Data-HR","Date","5",RQGS.num));
    verifyMessageList.add(new VerifyMessage("personnel data-HR","date","14",RQGS.num));
    verifyMessageList.add(new VerifyMessage("personnel data-HR","date","19",RQGS.num));
    Map<VerifyMessage, VerifyMessage> map = new HashMap<>();
    for (VerifyMessage verifyMessage : verifyMessageList) {
        if (map.containsKey(verifyMessage)) {
            map.put(verifyMessage, VerifyMessage.merge(map.get(verifyMessage), verifyMessage));
        } else {
            map.put(verifyMessage, verifyMessage);
        }
    }
    for (VerifyMessage verifyMessage :map.values()){
        System.out.println(verifyMessage);
    }
}

Output:

VerifyMessage{sheetName='personnel data-HR', columnName='date', rowNum='5,14,19', verifyType=1}
VerifyMessage{sheetName='scheduling and target import', columnName='scheduling duration' , rowNum='1,3,7,9', verifyType=2}

to sum up

You can change the merge logic according to your actual needs.

Guess you like

Origin blog.csdn.net/wangpei930228/article/details/108867240