2013-08-01 3 views
1

Я пытаюсь сделать мое небольшое приложение напечатать только определенные ключи внутри хэш-карты (из которых не содержат «нежелательных» строк). Путь, в котором я попытался это показано ниже:Печать только определенных ключей в hashmap

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

    String[] unwanted = {"hi", "oat"}; 

    items.put("black shoes", 1); 
    items.put("light coat", 10); 
    items.put("white shoes", 40); 
    items.put("dark coat", 90); 

    for(int i = 0; i < unwanted.length; i++) { 
     for(Entry<String,Integer> entry : items.entrySet()) { 
      if(!entry.getKey().contains(unwanted[i])) { 
       System.out.println(entry.getKey() + " = " + entry.getValue()); 
      } 
     } 
    } 

Но он печатает это:

dark coat = 90 
black shoes = 1 
light coat = 10 
white shoes = 40 
black shoes = 1 

Однако, он предназначен для печати это вместо того, чтобы (как это предполагается опустить ключи с «привет "и„овсяная“в них, которые нужно просто оставить :)

black shoes = 1 

Я не знаю, почему я не в состоянии видеть ошибку, но, надеюсь, кто-то может помочь мне указать на это.

+0

вы должны проверить, есть ли какая-либо из ваших нежелательных строк в каждом ключе до их распечатки ... в вашем решении yoor for loop проверяет, находится ли одна из ваших двух нежелательных строк в ключе. . if (! black shores.contains ("hi")) sysout (...) вот почему у вас неправильный результат – redc0w

ответ

2

Неправильная внутренняя логика цикла. Он будет печатать запись хэш-карты, если одна из нежелательных строк отсутствует.

изменить для цикла логики, как показано ниже ...

bool found = false; 
for(Entry<String,Integer> entry : items.entrySet()) { 
    found = false; 
    for(int i = 0; i < unwanted.length; i++) { 
     if(entry.getKey().contains(unwanted[i])) { 
      found = true;    
     } 
    } 
    if(found == false) 
     System.out.println(entry.getKey() + " = " + entry.getValue()); 
} 
1

Если вы видите свой внешний контур:

for(int i = 0; i < unwanted.length; i++) 

тогда итерирует через

String[] unwanted = {"hi", "oat"}; 

Ваша карта является следующим:

"dark coat" : 90 
"white shoes": 40 
"light coat" : 10 
"black shoes", 1 

Таким образом, в первой итерации,

unwanted[i]="hi" 

Таким образом, ваш внутренний цикл не печатает «белые туфли» и довольно печатает:

dark coat = 90 
black shoes = 1 
light coat = 10 

, поскольку они не содержат «привет»

На втором этапе,

unwanted[i]="oat" 

Таким образом, ваш внутренний цикл не печатает "dark coat" и "light coat" и выводит оставшиеся с карты:

white shoes = 40 
black shoes = 1 

Таким образом, вы получаете объединенный выход выше двух итераций, как:

dark coat = 90 
black shoes = 1 
light coat = 10 
white shoes = 40 
black shoes = 1 

Так что вы можете сделать это попробовать этот код, в котором внутренний цикл и внешние петли перевернутые:

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

    String[] unwanted = {"hi", "oat"}; 
    items.put("black shoes", 1); 
    items.put("light coat", 10); 
    items.put("white shoes", 40); 
    items.put("dark coat", 90); 

    boolean flag; 
    for(Map.Entry<String,Integer> entry : items.entrySet()) { 
     if(!stringContainsItemFromList(entry.getKey(),unwanted)) 
      System.out.println(entry.getKey() + " = " + entry.getValue()); 
    } 

в коде выше мы использовали статическую функцию:

public static boolean stringContainsItemFromList(String inputString, String[] items) 
    { 
     for(int i =0; i < items.length; i++) 
     { 
      if(inputString.contains(items[i])) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

Надеюсь, что помогло!

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