HashMap Внутри ArrayList в Java перезаписывается - PullRequest
1 голос
/ 25 февраля 2020

Предположим, у меня есть строка "abca". Я хочу отслеживать каждое вхождение алфавита в каждом индексе, используя HashMap & ArrayList в Java. Например, если a = 0, b = 1, c = 2, я хочу вывод, как показано ниже: для ввода: abca

[{0=1},{0=1, 1=1},{0=1, 1=1, 2=1},{0=2, 1=1, 2=1}];

Я написал это решение в Java:

public static void main(String[] args){
     Scanner in = new Scanner(System.in);

     String x = in.next();
     char a[] = x.toCharArray();
     HashMap<Integer,Integer> hm = new HashMap();
     ArrayList<HashMap<Integer,Integer>> list = new ArrayList();

     for(int i=0;i<a.length;i++){
         if(hm.get((int)a[i]-97)==null){
             hm.put((int)a[i]-97, 1);
         }
         else{
             int pow = hm.get((int)a[i]-97);
             pow++;
             hm.put((int)a[i]-97, pow);
         }
         list.add(hm);
        // System.out.println(list);
     }
     System.out.println(list);
}

Но я получаю вывод в виде:

[{0=2, 1=1, 2=1}, {0=2, 1=1, 2=1}, {0=2, 1=1, 2=1}, {0=2, 1=1, 2=1}]

В конце итерации ArrayList обновляет все индексы последней стадии HashMap.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

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

list.add(new HashMap<>(hm));

output:

[{0 = 1}, {0 = 1, 1 = 1}, {0 = 1, 1 = 1, 2 = 1}, {0 = 2, 1 = 1, 2 = 1}]

1 голос
/ 25 февраля 2020

Ну, если вам интересно, вы также можете сделать это следующим образом.

         Scanner in = new Scanner(System.in);
         String x = in.next();
         char a[] = x.toCharArray();
         List<HashMap<Integer, Integer>> list = new ArrayList<>();
         HashMap<Integer, Integer> hm = new HashMap<>();

         for (char c : a) {
             hm.compute(c-'a', (k,v) -> v == null ? 1 : ++v);
             list.add(new HashMap<>(hm));
         }

         System.out.println(list);

Метод hm.compute() ищет значение для предоставленного ключа.

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