HashMap с String и Arraylist - сообщение об ошибке - PullRequest
2 голосов
/ 23 апреля 2011

Я получаю сообщение об ошибке.

Подозрительный вызов java.util.Map.ContainsValue Данный объект не может содержать экземпляр String (кроме ArrayList)

Thisэто небольшая версия программы, с которой я работаю.Может кто-нибудь подсказать, как это исправить?Пожалуйста, отправьте код.Я не сильный программист.

import java.util.ArrayList;
import java.util.HashMap;


public class Main {
  public static void main(String[] a) {
    HashMap<String,ArrayList> map = new HashMap<String,ArrayList>();
    //hashMap.put(key, new ArrayList());
    map.put("key1", new ArrayList());
    map.get("key1").add("value2");

    //System.out.println(map.containsKey("key1"));
    System.out.println(map.containsValue("value2"));
  }
}

Ответы [ 5 ]

3 голосов
/ 23 апреля 2011

У вас есть HashMap, который имеет String s для ключей и ArrayList s для значений:

HashMap<String,ArrayList> map = new HashMap<String,ArrayList>();

Затем вы попробуйте и посмотрите, содержит ли оно значение, равное String

System.out.println(map.containsValue("value2"));

Это очень подозрительно.Потому что этого не может быть.

1 голос
/ 23 апреля 2011

Вы можете попробовать этот пример,

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class Main {
    public static void main(String[] a) {
        HashMap<String, List<String>> map = new HashMap<String, List<String>>();
        map.put("key1", new ArrayList());
        map.get("key1").add("value2");

        // System.out.println(map.containsKey("key1"));
        System.out.println(map.containsValue(Arrays.asList(new String[]{"value2"})));
    }
}
0 голосов
/ 23 апреля 2011

Поскольку вы, по-вашему, «не сильный» программист, я думаю, было бы полезно указать на несколько других моментов.

  1. Даже в самых лучших обстоятельствах это потребует тестирования (в среднем) половины значений в хэш-таблице. Если значение не там, то он будет проверять все из них. Если на карте много записей, это будет дорого.

  2. Имейте в виду, что равенство списков определено на основе попарного тестирования элементов списка с использованием Object.equals(Object).

  3. Если вы на самом деле пытаетесь найти «значение2» в одном из списков, тогда этот подход не будет работать. Вам нужен вложенный цикл; например решение @kingdavies. Но дело в том, что это будет еще дороже.

  4. В этом фрагменте кода есть подсказка о "запахе кода". Я не могу быть уверен, не глядя на реальное приложение, но отображение строки в список объектов пахнет «отрицанием объекта»; т.е. пытаться использовать универсальные типы коллекций, чтобы избежать создания собственного класса.

0 голосов
/ 23 апреля 2011
public class Main {

    public static void main(String[] a) {
        HashMap<String, List<String>> map = new HashMap<String, List<String>>();
        map.put("key1", new ArrayList());
        map.get("key1").add("value2");

        for (List<String> value : map.values()) {
            System.out.println(value.contains("value2"));
        }

    }
}
0 голосов
/ 23 апреля 2011

Сообщение довольно ясно. Значения вашей карты имеют тип ArrayList. Вы передаете String в containsValue () вместо ArrayList. Таким образом, вы получаете ошибку.

Кстати, хорошая привычка - это определять типы переменных как можно менее ограничительно, например, объявлять карту как тип карты вместо HashMap

Map<String,List> map = new HashMap<String,ArrayList>();

Таким образом, вы можете заменять различные реализации по мере необходимости с минимальным волновым эффектом. В этом случае, объявив карту как карту, вы можете в будущем переключиться на TreeMap.

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