仅打印散列映射中的特定键

时间:2013-08-01 10:57:17

标签: java arrays hashmap key

我一直在努力让我的小应用程序只打印一个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

然而,它意味着打印它(因为它应该省略其中的“hi”和“oat”的键,它们应该离开:)

black shoes = 1

我不知道为什么我没有看到错误,但希望有人可以帮我指出。

3 个答案:

答案 0 :(得分:2)

您的内循环逻辑不正确。只要一个不需要的字符串不存在,它就会打印一个hashmap条目。

将for循环逻辑更改为如下所示...

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 :(得分: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

因为它们不包含“hi”

在第二次交互中,

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;
    }

希望有所帮助!!

答案 2 :(得分:0)

这个想法是首先通过mapentrySet通过条目列表,在iterate迭代中获取ith条目中的所有条目然后打印它的值

ith