Hashmap значение равно нулю каждый раз - PullRequest
0 голосов
/ 08 марта 2020

Я создаю хэш-карту, где мой ключ - строка, а значение - список. Из Excel я читаю все значения строк и добавляю в список. Затем список сопоставляется с ключом. Но при попытке значения для ключа его возвращаемое значение равно нулю. Пожалуйста, дайте мне знать, что не так в коде.

    private static void FCToProjectsMapping(String RefFilename)
  {
    System.out.println(RefFilename);

    Workbook wb = null;
    HashMap<String, ArrayList<String>> MappingFCInProjects = new HashMap<String, ArrayList<String>>();

    try
    {
      if (RefFilename == null || RefFilename.isEmpty()) 
      {
        System.out.println("Workbook is empty or Not available");
      }
      try
      {
        wb = new XSSFWorkbook(new FileInputStream(RefFilename));
      }
      catch(Exception e)
      {
        System.out.println(e);
      }

      Sheet sheet = wb.getSheet("Sheet0");

      int TotalColumnNo = sheet.getRow(1).getLastCellNum();

      for (int ColNo = 2; ColNo < TotalColumnNo; ColNo++)
      {
        ArrayList<String> itemList=new ArrayList<String>();

        String FCNAME = sheet.getRow(1).getCell(ColNo).getStringCellValue().trim();
        String ClassificationNAME = sheet.getRow(2).getCell(ColNo).getStringCellValue().trim();
        String AltNo = sheet.getRow(3).getCell(ColNo).getStringCellValue().trim();
        String Version = FCNAME + "/" + AltNo + "_" + ClassificationNAME;

        for (int RowNo=5; RowNo <= sheet.getLastRowNum(); RowNo++)
        {
          if(sheet.getRow(RowNo).getCell(ColNo)!=null && !sheet.getRow(RowNo).getCell(ColNo).getStringCellValue().isEmpty())
          { 
              String ProjectName = "";

              if(sheet.getRow(RowNo).getCell(ColNo)!=null && !sheet.getRow(RowNo).getCell(ColNo).getStringCellValue().isEmpty())
              { 
                ProjectName = sheet.getRow(RowNo).getCell(1).getStringCellValue().trim();               
                itemList.add(ProjectName);
              }
          }
        }
        if(!MappingFCInProjects.containsKey(Version))
        {
          MappingFCInProjects.put(Version, itemList); 
        }
        itemList.clear();
      }          
      wb.close();      

    }
    catch(Exception error)
    {
      System.out.println("Error occured in FCToProjectsMapping function is "+ error);
    }

  }

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Вы вставляете itemList в карту, затем очищаете ее, так что теперь у вас есть пустой список на карте. Вызов put(Version, itemList) не копирует список, он вставляет сам список.

Удаляет строку itemList.clear();, и эта часть кода будет работать.

Другие проблемы:

  • Вы должны использовать new XSSFWorkbook(new File(RefFilename)), чтобы не загружать весь файл в память.

  • Вы должны удалить try-catch вокруг new XSSFWorkbook позвоните и позвольте catch в конце обработать его.

  • На самом деле, вы должны использовать try-with-resources :

    if (RefFilename == null || RefFilename.isEmpty()) 
    {
      System.out.println("Workbook is empty or Not available");
      return; // <== add this to prevent NullPointerException
    }
    try (XSSFWorkbook wb = new XSSFWorkbook(new File(RefFilename)))
    {
      ...
    
  • Поскольку вы просто отбрасываете itemList без его использования, перед RowNo l oop необходимо сделать следующее:

    if (! MappingFCInProjects.containsKey(Version))
    {
      continue; // skip processing of column
    }
    
0 голосов
/ 08 марта 2020

Причина, по которой он равен нулю, заключается в том, что когда вы создаете новый список и помещаете в него элементы, вы очищаете тот же список. for (int ColNo = 2; ColNo В ЭТОЙ СТРОКЕ ВЫ СОЗДАЕТЕ СПИСОК

            String FCNAME = sheet.getRow(1).getCell(ColNo).getStringCellValue().trim();
            String ClassificationNAME = sheet.getRow(2).getCell(ColNo).getStringCellValue().trim();
            String AltNo = sheet.getRow(3).getCell(ColNo).getStringCellValue().trim();
            String Version = FCNAME + "/" + AltNo + "_" + ClassificationNAME;

            for (int RowNo = 5; RowNo <= sheet.getLastRowNum(); RowNo++) {
                if (sheet.getRow(RowNo).getCell(ColNo) != null
                        && !sheet.getRow(RowNo).getCell(ColNo).getStringCellValue().isEmpty()) {
                    String ProjectName = "";

                    if (sheet.getRow(RowNo).getCell(ColNo) != null
                            && !sheet.getRow(RowNo).getCell(ColNo).getStringCellValue().isEmpty()) {
                        ProjectName = sheet.getRow(RowNo).getCell(1).getStringCellValue().trim();
                        itemList.add(ProjectName);
                    }
                }
            }
            if (!MappingFCInProjects.containsKey(Version)) {
                MappingFCInProjects.put(Version, itemList);
            }
            itemList.clear();//YOU CLEAR THE SAME INSTANCE
        }

// Вам нужно прокомментировать строку itemList.clear, чтобы она заработала

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...