我的java程序无法读取我的文件

时间:2012-10-10 12:40:05

标签: java map

我有一些像这样的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。我在这里错过了什么吗?

提前致谢。

5 个答案:

答案 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)作为关键字。 这是错的。