2017-02-20 10 views
1

У меня есть hashmap, который имеет его ключ String и значения, хранящиеся как List.Сравните значения Hashmap, которые хранятся в виде структуры списка

Map<String,List<Integer>> posmap = new HashMap<>(); 

Поскольку у меня есть несколько значений под тем же ключом. Так, например, у меня есть 4 ключа и значения:

[1681, 3523]

[276, 489]

[1527, 2865]

[300]

Также у меня есть еще один treeList, который содержит эти значения как отсортированные. Что я хочу сделать (и спрашиваю);

Iterator<Integer> itr=myTreeSet.iterator(); 
    while(itr.hasNext()) 
    { 
     int check = itr.next(); 
     for(Object value : map2.entrySet()) 
     { 
      //System.out.println("Value is :" + value); 

     } 
    } 

Я хочу проверить ITR, как показано в коде с моим Hashmap entrySet и если равно возвращают Hashmap код key.Above возвращает entrySet как массив. Вкратце, как проверить itr, относятся к entrySet hashmap и принадлежат к какому ключу.

Я принимаю map1 и map2 в качестве параметра

static void game(Map map1, Map map2, Hero h, HashSet< Integer> hash) 

я извиняюсь, ребята. Я не понимал, что думаю, что вы смущены. Сначала я определяю эти карты в главном func:

Map<String, Enemy> enemymap = new HashMap<>(); 
Map<String,List<Integer>> posmap = new HashMap<>(); 

И я заполнил их также в главном func. После заполнения их я отправил их в свою функциональную игру, которая в вопросе. posmap - map2. Поэтому я указываю как posmap. Извините за недопонимание. Полный код func.

static void game(Map map1, Map map2, Hero h, HashSet< Integer> hash) 
{ 
    TreeSet<Integer> myTreeSet = new TreeSet<>(); // For sorting min to max-for alignment 
    myTreeSet.addAll(myHashset); 
    System.out.println(myTreeSet); 
    String start = "Micheal started travel with" + " " + h.getHealth() + " " + "HP!"; 
    Iterator<Integer> itr=myTreeSet.iterator(); 
    while(itr.hasNext()) 
    { 
     int check = itr.next(); 
     /* for(Map.Entry<String, List<Integer>> entry : map2.entrySet()) 
      { 
       if(entry.getValue() != null && entry.getValue().contains(check)) 
       System.out.println("The key " + entry.getKey() + "contains the treeset value " + check); 

      } -/ 
    } 

} 

Отправка из главного меню FUNC как:

game(enemymap, posmap , hero, myHashset); 
+0

Я не уверен, что понимаю вопрос, потому что он такой неряшливый. Предполагается, что 'posmap' должен быть таким же, как' map2'?Но если вы хотите проверить, является ли целое число в одном из списков значений на карте, вам нужно посмотреть все значения и использовать что-то вроде 'List.contains'. И не говорите «Значение объекта», скажем «Map.Entry > value'. В противном случае вы не сможете получить значения. – ajb

+0

Я думаю, что ваше разъяснение сделало вещи менее ясными. Кроме того, использование типов raw (например, «Map», вместо «Map >') в вашем списке параметров затруднит запись кода, чтобы делать правильные вещи, поскольку компилятор не знает, что ваши ключи это строки, а ваши значения - списки. – ajb

ответ

1

Я буду рекомендовать следующий подход:

Iterator<Integer> itr=myTreeSet.iterator(); 
while(itr.hasNext()) 
{ 
    int check = itr.next(); 
    for(Map.Entry<String, List<Integer>> entry : map2.entrySet()) 
    { 
     if(entry.getValue() != null && entry.getValue().contains(check)) 
     System.out.println("The key " + entry.getKey() + "contains the treeset value " + check); 

    } 
} 
+0

Спасибо @ajb. Оцените свои входы. Просто исправил это. – VHS

+0

это говорит для map2.entrySet: Тип несоответствия: невозможно преобразовать из типа элемента Object в Map.Entry – Lucas

+0

Кстати, я беру map2 в качестве параметра. – Lucas

1

, так как вы не помните hashkey использованный при хранении Int в HashMap , вам нужно будет проверить, если int находится в любом из значений хэша.

for(Map.Entry<String,List<Integer>>entry: map2.values()) { 
    if(entry.getValue().contains(check)) return entry.getKey(); 
} 

что-то в этом духе.

2

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

EDITED советом @ AJB в:

Set<Integer> myTreeSet = new TreeSet<>(); 
Map<String,List<Integer>> posmap = new HashMap<>(); 
Iterator<Integer> itr = myTreeSet.iterator(); 

//The set of keys containing values in any list of posmap 
Set<String> matchedKeys = new HashSet<>(); 

//Iterate through the TreeSet Integers 
itr.forEachRemaining(itrVal -> { 
    //Stream each entry of the posmap 
    posmap.entrySet().stream() 
     //Remove the entries without the itrVal in the entry's list 
     .filter(entry -> entry.getValue().contains(itrVal)) 
     //Add each key with a match to the set 
     .forEach(matchedEntry -> matchedKeys.add(matchedEntry.getKey())); 
}); 

return matchedKeys; 

Это может быть хороший подход, если у вас есть Apache Commons в вашем распоряжении:

Set<Integer> myTreeSet = new TreeSet<>(); 
Map<String,List<Integer>> posmap = new HashMap<>(); 
Iterator<Integer> itr = myTreeSet.iterator(); 

Set<String> matchedKeys = new HashSet<>(); 

List<Integer> treeSetValues = IteratorUtils.toList(itr); 

treeSetValues.stream().map(val -> { 
    return posmap.entrySet().stream() 
     .filter(entry -> entry.getValue().contains(itrVal)) 
     .collect(Collectors.toSet()); 
}); 

return matchedKeys; 

Если вы не можете использовать IteratorUtils.toList() , вы можете использовать Guava и Lists.newArrayList().

+0

Когда я разместил это решение, я подумал, что в posmap были найдены значения из списка. Однако в вашем вопросе вдруг появилась карта2? –

+0

Я думаю, что использование 'Map.Entry' более эффективно. Ваш метод извлекает все ключи, а затем выполняет поиск по каждому ключу. Когда вы извлекаете все ключи с карты, значения должны быть легко доступны, рядом с клавишами. Но вы игнорируете ценности, а затем снова смотрите на них, что делает двойную работу. Использование 'entrySet()' позволит избежать избыточной работы. Ваш код выглядит хорошо для меня - это всего лишь предложение о том, как его можно улучшить. – ajb

+0

Нет. posmap - фактическое значение. map2 - это имя параметра. Ответ на комментарий Мэтта. – Lucas

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