Добавить элементы в HashMap, содержащий ArrayList - PullRequest
0 голосов
/ 17 февраля 2019

Предполагается, что этот простой метод добавляет элементы в HashMap.Элементы читаются из текстового файла, я проверил это, и все, что касается этой области, работает просто отлично.Проблема возникает, когда я печатаю значения, которые есть на карте. Поэтому я думаю, что при добавлении их могут возникнуть некоторые проблемы.

Содержимое txt-файла:

SW: (scores, 90); (scores, 91); (scores, 92);

ГдеРазрешения - "SW", а Атрибуты - "(баллы, 90) ... (баллы, 92)".Это элементы, используемые в следующих методах.

public Map<Permissions, ArrayList<Attributes>> paMap; 

public void addMap(Permissions per, Attributes att) {
    if(paMap.containsKey(per)) {
        paMap.get(per).add(att);            
    }
    else{
        ArrayList<Attributes> attList = new ArrayList<Attributes>();
        attList.add(att);
        paMap.put(per, attList);
    }
}

 //Attributes contain variables (Scores) and values(90-93), that is just for printing

public void printMap() {
    ArrayList<Attributes> list;

    for(Permissions p: paMap.keySet()) {
        list = paMap.get(p);
        System.out.print(p.name + ": ");

        for(Attributes l: list) {
            System.out.print("<" + l.variable +", " + l.value + ">; ");
        }
        System.out.println();
    }

Когда я печатаю Карту, я ожидаю получить то же самое, что и в текстовом файле, но вместо этого я получаю

SW: (баллы 92);(баллы 92);(очки, 92)

Даже если я удаляю строку paMap.get(per).add(att) из метода addMap, я получаю SW: (оценки, 92);

Кроме того, я проверил, если дляцикл вызывается правильно, и это так.

Поэтому я запутался в том, как обновляются атрибуты в ArrayList и каков будет правильный способ сделать это.Видите ли вы какие-либо ошибки в способе добавления или печати значений?

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Пара предложений:

  • использовать интерфейсы в объявлении Map:
public Map<Permissions, List<Attributes>> paMap; 
  • для использования в качестве ключа в Map убедитесь, что Permissions является неизменным и имеет equals и hashCode, правильно определенные

Итак, если предположить, что Permissions имеет только 1 строковое поле, оно должно выглядеть примерно так:

public final class Permissions {
  private final String permission;
  public Permissions(String permission) {
    this.permission = permission;
  }
  public String getPermission() {
    return this.permission;
  }
  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    Permissions that= (Permissions ) o;
    return Objects.equals(this.permission, that.permission);
  }
  @Override
  public int hashCode() {
    return Objects.hash(this.permission);
  }
}
  • Попробуйте другую реализацию метода printMap.Например, с Java 8:
  private void printMap() {
    paMap.entrySet().stream().map(this::format).forEach(System.out::println);
  }
  private String format(Map.Entry<Permissions, List<Attributes>> entry) {
    String key = formatPermissions(entry.getKey());
    String value = formatAttributes(entry.getValue());
    return String.format("%s: %s", key, value);
  }
  private String formatPermissions(Permissions permissions) {
    return permissions.name;
  }
  private String formatAttributes(List<Attributes> attributes) {
    return attributes.stream()
            .map(attr -> String.format("(%s, %s)", attr.variable, attr.value))
            .collect(Collectors.joining("; "));
  }
0 голосов
/ 17 февраля 2019

Я не знаю, как выглядит метод чтения, но кажется, что вы все время добавляете один и тот же атрибут, поэтому, возможно, в функции чтения вы не создаете новый атрибут, а все время используете один и тот же объект и просто вызываете наборы для этого,поэтому в массиве lsit в конце один и тот же объект добавляется трижды

btw: также метод addmap можно заменить на:

paMap.computeIfAbsent(per,x->new ArrayList<Attributes>()).add(att);

Если вы используете java8 и выше;)

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