我有一些像这样的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();
}
我的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
我非常困惑,为什么只有12
元素被读入我的map
。我在这里错过了什么吗?
提前致谢。
答案 0 :(得分:5)
解决方案很简单:此行中的参数顺序错误:
map.put(tempMap,parts[0]);
应该说
map.put(parts[0],tempMap);
您必须相应地更改变量声明的类型参数。你在哪里
Map<Map<String,String>,String> map = new HashMap<>();
你必须把
Map<String,Map<String,String>> map = new HashMap<>();
总而言之,在完成这些更改之后,我相信您将拥有您真正想要的结构:从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++];
}
}
首先,这种方法更好,因为您的阅读循环变得更简单,更重要:
while ((sCurrentLine = br.readLine()) != null) {
final CardHolder ch = new CardHolder(sCurrentLine.split(","));
map.put(ch.cardNumber, ch);
}
此外,这将允许您更好地控制记录的其他方面;例如一个不错的自定义toString
和类似的。还要注意,这几乎没有产生更多的代码:它只是通过关注分离原则进行了重组。
(最后的一个小观察:在Java中,字符串变量的s前缀不习惯,因为它在静态类型语言中是多余的;请放心,由于整数出现在哪里,你永远不会遇到Java中的错误期待一个字符串。)
答案 1 :(得分:2)
您应该更改,如何创建地图..代替您的以下声明: -
Map<Map<String,String>,String> map = new HashMap<>();
而不是这个,你应该有: -
Map<String, Map<String,String>> map = new HashMap<>();
您应始终将不可变类型作为地图中的关键字。
此更改后,您应该更改: -
map.put(tempMap,parts[0]);
来: -
map.put(parts[0], tempMap);
答案 2 :(得分:1)
我认为你有
中的论据map.put(tempMap,parts[0]);
反转。您正在将tempMap映射到数字,您可能希望将数字映射到tempMap:
map.put(parts[0], tempMap);
使用
Map<String, Map<String,String>> map = new HashMap<>();
答案 3 :(得分:1)
您应该使用Map作为值,因为 HashMap相等性基于它具有的键值对。。
map.put(parts[0],tempMap);
下面的简单程序将说明这一事实
Map<String, String> tempMap1 = new HashMap<String, String>();
tempMap1.put("issuing_bank", "ICICI");
tempMap1.put("card_switch", "Visa");
tempMap1.put("card_Type", "Debit");
Map<String, String> tempMap2 = new HashMap<String, String>();
tempMap2.put("issuing_bank", "ICICI");
tempMap2.put("card_switch", "Visa");
tempMap2.put("card_Type", "Debit");
System.out.println(tempMap1.equals(tempMap2));//Prints true
输出:
true
所以你的声明应该如下。请记住,您应始终将不可变对象用作HashMap中的键。
Map<String,Map<String,String>> map = new HashMap<String,Map<String,String>>();
答案 4 :(得分:-1)
那是因为您正在使用地图(tempMap)作为关键字。
这是错的。