我有一些像这样的Java代码:
Map<Map<String,String>,String> map = new HashMap<>();
int i = 0;
try (BufferedReader br = new BufferedReader(new FileReader("properties.txt")))
{
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
i++;
String[] parts = sCurrentLine.split(",");
System.out.println(parts[2]);
Map<String,String> tempMap = new HashMap<>();
tempMap.put("issuing_bank",parts[1]);
tempMap.put("card_switch",parts[2]);
tempMap.put("card_Type",parts[3]);
map.put(tempMap,parts[0]);
}
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
看起来很奇怪,我map只包含12从我的文本文件中存储的第一个元素.出于调试目的,我使用了变量i并将其打印出来,这是打印的值22,这是我的文本文件中的确切计数.
我的文本文件如下所示:
447747,ICCI,Visa,Credit
421323,ICCI,Visa,Debit
421630,ICCI,Visa,Debit
455451,ICCI,Visa,Debit
469375,ICCI,Visa,Debit
523951,ICCI,MasterCard,Credit
5399,ICCI,MasterCard,Debit
517652,HDFC,MasterCard,Credit
558818,HDFC,MasterCard,Credit
512622,SBI,MasterCard,Credit
526468,SBI,MasterCard,Credit
400975,Citi,Visa,Credit
402856,Citi,Visa,Credit
461726,Citi,Visa,Credit
552004,Citi,MasterCard,Debit
468805,Axis,Visa,Debit
418157,ICCI,Visa,Debit
524133,Citi,MasterCard,Credit
528945,HDFC,MasterCard,Credit
437748,SBI,MasterCard,Credit
524111,HDFC,MasterCard,Credit
431757,SBI,Visa,Credit
Run Code Online (Sandbox Code Playgroud)
我非常困惑,为什么只有12元素被读入我的map.我在这里错过了什么吗?
提前致谢.
解决方案很简单:此行中的参数顺序错误:
map.put(tempMap,parts[0]);
Run Code Online (Sandbox Code Playgroud)
应该说
map.put(parts[0],tempMap);
Run Code Online (Sandbox Code Playgroud)
您必须相应地更改变量声明的类型参数.你在哪里
Map<Map<String,String>,String> map = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
你必须把
Map<String,Map<String,String>> map = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
总之,在这些变化之后,我相信你将拥有你真正想要的结构:从parts[0]其他记录字段的地图到地图.
我应该补充一点,你的解决方案(除了你的昵称:)会让你成为一个主要使用像Groovy这样的动态语言编写代码的开发人员; 这种风格不适合Java的语言功能.在Java中,您最好定义一个专门的bean类:
public class CardHolder {
public final String cardNumber, issuingBank, cardSwitch, cardType;
public CardHolder(String[] record) {
int i = 0;
cardNumber = record[i++];
issuingBank = record[i++];
cardSwitch = record[i++];
cardType = record[i++];
}
}
Run Code Online (Sandbox Code Playgroud)
首先,这种方法更好,因为您的阅读循环变得更简单,更重要:
while ((sCurrentLine = br.readLine()) != null) {
final CardHolder ch = new CardHolder(sCurrentLine.split(","));
map.put(ch.cardNumber, ch);
}
Run Code Online (Sandbox Code Playgroud)
此外,这将允许您更好地控制您的记录的其他方面; 例如一个很好的习惯toString和类似的.还要注意,这几乎没有产生更多的代码:它只是通过关注分离原则进行了重组.
(最后的一个小观察:在Java中,字符串变量的s前缀不习惯,因为它在静态类型语言中是多余的;请放心,由于字符串出现的整数出现,你永远不会遇到Java中的错误预期.)