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

    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

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

4

3 回答 3

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());
}
于 2013-08-01T11:05:49.690 回答
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;
    }

希望有帮助!!

于 2013-08-01T11:39:01.167 回答
0

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

Iterator itr = yourMap.entrySet().iterator();
while(itr.hasNext()) {
    Map.Entry entry = (Map.Entry)itr.next();
    System.out.print("(Key: " + entry.getKey() + " ,  Value:" + entry.getValue()); 
} 
于 2021-02-11T06:12:26.393 回答