2014-03-14 2 views
0

У меня есть сценарий, когда мне нужно было пройти через HashMap, чтобы проверить нулевые значения и сгенерировать пустой компонент. Пустой bean-компонент снова будет добавлен в новую карту.Итерация через хэш-карту со строкой и список как параметры

for (String course_date : shiftSet) { 
     Bean courseBean = null; 
     boolean valueExists = false; 

       for (Entry<String, List<Bean>> entry: courseMap.entrySet()){ 

        String studentDetail = entry.getKey(); 
        String [] studentSet = StringUtils.getArray(studentDetail , ","); 
        String studentId = studentSet[0]; 
        String courseId = studentSet[1]; 

        for(Bean resultBean : entry.getValue()){ 

         if(course_date.equalsIgnoreCase(resultBean.getCourseDate()){ 
          valueExists = true; 
         } 
       } 
         if(!valueExists) { 
          courseBean = new Bean(); 
          courseBean.setStudent(studentId); 
          courseBean.setCourse(courseId); 
          List<Bean> courseList = entry.getValue(); 
          courseList.add(courseBean); 
          outputMap.put(studentId+courseId, courseList); 
         } 
      } 
     } 

Булево значение всегда истинно, даже если оно не удовлетворяет условию внутреннего цикла.

Может ли кто-нибудь предложить лучшее решение для достижения желаемого результата?

Заранее спасибо

+3

Инициализировать переменную 'false' значения в первом' for' петле ... –

+0

не связан с вашей проблемой, но _please_ не пишет 'String value = entry.getKey();'. Запись имеет ключ и значение. Давайте не будем менять имена. –

+0

@ Luiggi Можете ли вы объяснить, как определить индекс цикла для моего случая. Спасибо за ваши комментарии. – jaggs

ответ

1

Основная проблема заключается в том, что переменная valueExists инициализируется перед циклом for, где это необходимо для каждой проверки. Перепишите это как:

//declare it here (regardless this "initial" value) 
boolean valueExists = false; 
for (Entry<String, List<Bean>> entry: courseMap.entrySet()) { 
    //initialize it here 
    valueExists = false; 
    //... 
    for (Bean resultBean : entry.getValue()) { 
     if(course_date.equalsIgnoreCase(resultBean.getCourseDate()){ 
      valueExists = true; 
      //also, add a break here since you already found the value 
      //you don't need to keep iterating through the rest of items 
      break; 
     } 
    } 
    if (valueExists) { 
     //... 
    } 
} 
+0

Спасибо Luiggi.I пытались сделать то же самое. Но неуместно объявление valueExists part.If я объявляю точно следующее внешнее для цикла, iam получает исключение нулевого указателя. Не уверен, почему это происходит .. – jaggs

+0

@jegadees Я не знаю, Не понимаю ваш комментарий. Возможно, если вы отредактируете свой вопрос и добавите (не удаляйте что-либо из него) свой новый код с помощью stacktrace, я мог бы найти проблему. –

+0

Я получаю сообщение об ошибке внутри цикла, когда valueexists является false.The часть, где пустой bean сгенерирован и добавлен .. – jaggs

1

У вас есть 2 переменные с тем же именем value. Один из них - String - другой логический. Думаю, эта двусмысленность смущает нас, себя и компилятора. На самом деле ваш код даже не компилируется.

+0

извините за свою ошибку при копировании кода .. теперь изменено .. Спасибо – jaggs

+0

Это исправляет любую опечатку, но не главную проблему. –

+0

Это не должен быть комментарий? – drewmoore

0

Однажды вы обнаружите, что даты совпадают, а затем выходят из цикла for. Поскольку вы выполняете итерирование по списку, ваша логическая переменная будет ложной, только если последняя запись в списке компонентов будет ложной.

Смотрите обзор кода, с возможным рабочим раствором

for (String course_date : shiftSet) { 
     Bean courseBean = null; 

      for (Entry<String, List<Bean>> entry: courseMap.entrySet()){ 

       // Declare this boolean variable inside, since you are dealing with a single entry in the map at a time. 
       boolean matchCourseDate = false; 

       //Declare variable with more meaningful naming conventions. 
       String key = entry.getKey(); 
       String [] studentSet = StringUtils.getArray(key, ","); 
       String studentId = studentSet[0]; 
       String courseId = studentSet[1]; 

       // Since, you are iterating over the list, make sure once you found the date match break out if this loop 
       for(Bean resultBean : entry.getValue()){ 
        if(course_date.equalsIgnoreCase(resultBean.getCourseDate()){ 
         matchCourseDate = true; 
        } 

        // If the match is found, break. Otherwise, keep going. 
        if(matchCourseDate) 
         break; 
       } 

       // If no match is found, then create a new bean and put it into output map. 
        if(!matchCourseDate) { 
         courseBean = new Bean(); 
         courseBean.setStudent(studentId); 
         courseBean.setCourse(courseId); 
         List<Bean> courseList = entry.getValue(); 
         courseList.add(courseBean); 
         outputMap.put(studentId+courseId, courseList); 
        } 
     } 
    } 
+0

Я получаю исключение нулевого указателя внутри matchcourseDate равно false loop..Когда компонент был добавлен в список, ошибка возникает .. – jaggs

Смежные вопросы