2013-08-01 81 views
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 

但是,它的目的是打印此而不是(因爲它應該與「省略鍵喜「和‘燕麥’內他們應該見好就收:)

black shoes = 1 

我不知道爲什麼我沒有看到了問題,但希望有人可以幫我指出來。

+0

你必須檢查是否有任何不必要的字符串可以在每個鍵中找到之前打印出來...在你的解決方案yoor for循環只檢查你的兩個不需要的字符串之一是否在鍵中。 例如如果(!黑shores.contains(「嗨」))sysout(...) 這就是爲什麼你有你的錯誤結果 – redc0w

回答

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

如果你看到你的外循環:

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

希望有幫助!