我怎样才能总结与哈希映射中的一个重复密钥关联的值

我想在hashmap中添加相同键的值。 例如:

ABC --> 123 DEF --> 456 ABC --> 123 XXX --> 111 XXX --> 222 

应该成为:

  ABC --> 246 DEF --> 456 XXX --> 333 

这是我迄今为止的代码:

 public class Reading { @SuppressWarnings("unchecked") public static void main(String[] args) throws IOException { //Create hashmap to store the the string and int in the excel sheet HashMap<String, Integer> hm = new HashMap<String, Integer>(); String key = null; int value = Integer.MIN_VALUE; // String chkeq; // this @SuppressWarnings("rawtypes") ArrayList list = new ArrayList(); // File path or EXCEL file FileInputStream fos = new FileInputStream( "/Users/SG/Desktop/tester.xls"); // Sheet is the individual sheet that the data is coming from, in this // case Sheet1 try { // Put the XLS file into HSSFWorkbook workbook = new HSSFWorkbook(fos); // Get first sheet from the project HSSFSheet sheet = workbook.getSheetAt(0); // Go through each row Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); // Go through each column in the rows Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); switch (cell.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: //System.out.print(cell.getBooleanCellValue() + "\t\t"); list.add(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_NUMERIC: //System.out.print(cell.getNumericCellValue() + "\t\t"); value = (int) cell.getNumericCellValue(); list.add(cell.getNumericCellValue()); break; case Cell.CELL_TYPE_STRING: //System.out.print(cell.getStringCellValue() + "\t\t"); key = cell.getStringCellValue(); //chkeq = cell.getStringCellValue(); /* for (int i = 0; cellIterator.hasNext(); i++) { if (chkeq == cellIterator.next().getStringCellValue()) { System.out.println("same" + cell.getStringCellValue()); } }*/ list.add(cell.getStringCellValue()); break; } if (key != null && value != Integer.MIN_VALUE) { hm.put(key, value); key = null; value = Integer.MIN_VALUE; } } //System.out.println(""); } for (String keys : hm.keySet()) System.out.println(keys + ":" + hm.get(keys)); fos.close(); // System.out.println(list); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 

注意:我已经使用Apache POI从Excel工作表中提取数据。

代码输出这个:

 DEF --> 456 ABC --> 123 XXX --> 222 

所有这一切都是用相等的密钥覆盖放入hashmap中的最后一个单元格。

有什么办法来总结价值而不是写他们?

把覆盖在地图上的任何东西。

您需要获取密钥(如果存在)的地图中的当前值并将其添加到您要存储的值。

 if(hm.containsKey(key)) hm.put(key, value + hm.get(key)); else hm.put(key, value); 

正如你所看到的, hm.put覆盖与键相关的以前的值(如果有的话)。 在Java 8中,有一种新方法传入值与现有值合并 。 您可以使用lambda来指定如何完成合并。 在这种情况下,合并操作是增加的,所以我们会这样做:

 hm.merge(key, value, (oldVal, newVal) -> oldVal + newVal); 

在Java 8之前,你必须使用一个有条件的,如Cheruvian的回答 。 (1)

简单地说,如果键的值存在,则检索值并将其与新值相加,并将其放回到映射相同的键

如果数据在Excel中,则数据透视表可以进行添加。