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.