循环不迭代全长

时间:2013-09-20 15:36:58

标签: java android hashmap iteration

我正在将一个String传递给一个以分隔符作为逗号的方法。

"TMJ,Emma,Sarah"

我使用','将此字符串标记为要拆分的正则表达式。

然后,我迭代标记化数组的长度,将每个元素与所有可能值的HashMap进行比较。如果正在测试的值是HashMap中的一个键,那么我得到键的值并将其存储在另一个String中。

我想将键的每个值附加到包含值的String。

它似乎只迭代一次,然后跳出循环并返回它在hashmap中找到的第一个东西。

有人可以解释为什么吗?先谢谢马特。

public static String getrecipientIntergerValues(String recipient) {

        Log.e(TAG, "recipient string list passed in to app obj = " + recipient);


         String[] tokenizedRecipient = recipient.split(",");
         String recipientAsInteger = "";

         for(int i = 0; i < tokenizedRecipient.length; i++){
             Log.e(TAG, "tokenizedRecipient = " + tokenizedRecipient[i].toString());
         }

         Log.e(TAG, "tokenizedRecipient length = " + tokenizedRecipient.length);

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



             if(recipients.containsKey(tokenizedRecipient[i].toString())){
                 Log.e(TAG, "hashmap contains key " + tokenizedRecipient[i].toString() + "with value " + recipients.get(tokenizedRecipient[i].toString()));
                 String integerValueOfName = recipients.get(tokenizedRecipient[i].toString());
                 recipientAsInteger = recipientAsInteger + integerValueOfName + ",";

             }

         }

        Log.e(TAG, "recipient list as integers = " + recipientAsInteger);

        return recipientAsInteger;
    }

09-20 16:33:51.039: E/NfcScannerApplication(25835): recipient string list passed in to app obj = Emma, TMJ, 
09-20 16:33:51.039: E/NfcScannerApplication(25835): tokenizedRecipient = Emma
09-20 16:33:51.064: E/NfcScannerApplication(25835): tokenizedRecipient =  TMJ
09-20 16:33:51.064: E/NfcScannerApplication(25835): tokenizedRecipient =  
09-20 16:33:51.079: E/NfcScannerApplication(25835): tokenizedRecipient length = 3
09-20 16:33:51.079: E/NfcScannerApplication(25835): hashmap contains key Emmawith value 3
09-20 16:33:51.089: E/NfcScannerApplication(25835): recipient list as integers = 3,

3 个答案:

答案 0 :(得分:1)

您的日志记录表明您传递的字符串为"Emma, TMJ, ",这不是您的建议。

09-20 16:33:51.039: ... recipient string list passed in to app obj = Emma, TMJ, 

我相信你的问题的解决方案是使用String.split(",",0),因为这会删除最后的空字符串。您可能还希望在查找地图中的字符串之前使用String.trim()

答案 1 :(得分:0)

如果没有看到recipients包含的内容,您可以放心地假设

if(recipients.containsKey(tokenizedRecipient[i].toString())){
    Log.e(TAG, "hashmap contains key " + tokenizedRecipient[i].toString() + "with value " + recipients.get(tokenizedRecipient[i].toString()));
    String integerValueOfName = recipients.get(tokenizedRecipient[i].toString());
    recipientAsInteger = recipientAsInteger + integerValueOfName + ",";
}

仅执行一次,因为recipients仅包含Emma的密钥。 for循环循环3次,但只匹配if一次。

如果您的recipients地图包含EmmaTMJ的密钥,那么您的问题就是split()方法,请查看其他答案。

答案 2 :(得分:0)

如果输入字符串是"Emma, TMJ,",则split将返回包含这两个字符串的数组:

"Emma"
" TMJ"

最后一个与"TMJ"不匹配。尝试使用", *"(或更好,"\\s*,\\s*")作为split使用的正则表达式(这会将额外空格视为分隔符的一部分,而不是将它们包含在结果字符串中);或者在结果字符串上使用.trim()方法(删除前导和尾随空格)。