как добавить ++ 1 к значению атрибута в списке Pojo, если атрибуты имеют то же значение, используя Java - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть огромные данные, извлеченные из БД в Список, как показано ниже

List<TestVO> aList=new ArrayList<TestVO>();     
TestVO testVO=new TestVO();
testVO.setName("val1");     
testVO.setTime("Time is --1");              
TestVO testVO2=new TestVO();
testVO2.setName("val2");        
testVO2.setTime("Time is --2");     
TestVO testVO3=new TestVO();
testVO3.setName("val1");        
testVO3.setTime("Time is --3");
aList.add(testVO);
aList.add(testVO2);
aList.add(testVO3);

Теперь я хочу добавить "_" + 1 для каждого аналогичного значения следующего атрибута имени Pojo в данном списке.Наконец, список должен иметь pojo как ниже

TestVO [name=val1_1, time=Time is --1]
TestVO [name=val1_2, time=Time is --3]
TestVO [name=val2, time=Time is --2] 

Пожалуйста, предложите, если я могу использовать любой API Java 8?Я пытался использовать Comparator, чтобы найти дубликаты, но не смог изменить данные нефа?ценим вашу помощь

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

В моем примере я попытался сократить создание временных объектов, потому что вы работаете с огромным списком, а создавать дубликаты нехорошо.

public static void resolveDuplicates(List<TestVO> aList) {
    Map<String, Integer> nameCount = new HashMap<>();
    aList.forEach(testVO -> nameCount.compute(testVO.getName(), (name, count) -> Optional.ofNullable(count).orElse(0) - 1));

    for (TestVO testVO : aList) {
        String name = testVO.getName();
        int count = nameCount.get(name);

        if (count == -1)
            count = 0;
        else
            testVO.setName(name + '_' + (count = Math.max(count, 0) + 1));

        nameCount.put(name, count);
    }
}
0 голосов
/ 20 декабря 2018

Вы можете сделать что-то в два шага:

Собрать в карту TestVO, которые имеют повторяющиеся имена, а затем изменить имя для них.

List<TestVO> aList = new ArrayList<TestVO>();      
//...
Map<String, TestVO> vosByName =
aList.stream()
     .collect(groupingBy(TestVO::getName))
     .values()
     .stream()
     .filter(l -> l.size()>1)      
     .forEach(list -> { 
                      int i = 1;
                      for (TestVO vo : list){
                        vo.setName(vo.getName() + "_" + i++);
                      }
                   }
     );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...