2017-04-18 48 views
0

为了帮助自己学习java,我使用JForm GUI创建了一个二十一点程序,其中包含可以创建的帐户并保持用于在每个游戏上投注的运行余额。我有一个BlackJackApp.JForm类,它是主类。帐户存储在.txt文件中,并使用包含readFile和writeFile方法的Account类读取。我创建了一个样本TXT文件,名为Accounts.txt,使用这些值:我的散列表只是将空值

李四>>百万

杰克·布莱克>> 1

鲍勃·多尔>> 987654321

(有在实际的txt文件中行之间没有空格)

我有一个读取文本文件并将这些值附加到HashMap的方法。这是我对该方法的代码。

public void readFile() 
{ 
    accountsMap.clear(); 
    BufferedReader br; 

    try 
    {  
    br = new BufferedReader(new FileReader("Accounts.txt")); 
    String nextLine = br.readLine(); 

     while(nextLine != null) 
     { 
      String lineString[] = nextLine.split(">>"); 
      Integer accountBalance = Integer.parseInt(lineString[1]); 
      System.out.println(lineString[0] + " " + lineString[1] + " " + 
      accountBalance); 
      accountsMap.put(lineString[0], accountBalance); 
      nextLine = br.readLine(); 
     } 
     br.close(); 
    } 
    catch(IOException frex) 
    {System.out.println("An error has occurred while reading the file");} 
} 

这是相关的代码我对JForm类,与包括以供参考

public class BlackjackApp extends javax.swing.JFrame { 

Account a = new Account(); 
String account; 
Integer accountBalance; 
HashMap accountsMap = a.getAccountsMap(); 


public void fillAccountNameBox() 
{ 

    for (int i = 0; i < accountsMap.size(); i++) 
    { 
     accountNameBox.addItem((String) accountsMap.get(i)); 
    } 


} 

public BlackjackApp() { 
    initComponents(); 
    a.readFile(); 
    fillAccountNameBox(); //fills comboBox component w/ list of hashMap keys 
    System.out.println(accountsMap.keySet()); 
    for(int i = 0; i < accountsMap.size(); i++) 
     System.out.println(accountsMap.get(i)); 

} 

的代码的System.out.println对于调试仅在顶部。这是输出:

John Doe 1000000 1000000 
Jack Black 1 1 
Bob Dole 987654321 987654321 
[Bob Dole, John Doe, Jack Black] 
null 
null 
null 

我的问题是这样的:为什么我的散列表放入正确的键,但留下它们的值为空? lineString数组正确填充,Integer accountBalance也是如此,但实际上将键/值对放入哈希映射中时,它只会将键放入,并且即使accountBalance不为null,也会将其值留空。为什么是这样?我已经尝试过寻找许多关于这个问题的建议,但是他们的建议都不适合我。必须有一些我可以忽略的东西,但作为初学者,我很难认识到问题所在。

回答

2

问题依赖于您打印信息的方式。 Map.get方法期望您传递一个参数和一个您想要的值的键。在for循环中,您要求附加到键0,1和2的值 - 因此为空值。 你的代码改成这样:

for(String key : accountsMap.keySet()) 
    System.out.println(accountsMap.get(key)); 

正如你所看到的,我也改变了使用的for-each for循环结构。

希望这可以帮助你。

+0

我终于明白我出错了,非常感谢你!我还在fillAccountBox()方法中更改了我的代码,以便该框将使用散列映射中的键的ArrayList填充。 – Matthew

+0

不客气,我很高兴能够帮到你。顺便提一下,还有两件事: 1)Map接口也有一个[values](http://docs.oracle.com/javase/8/docs/api/java/util/Map.html#values - )方法,您可以使用它来获取值的集合,如果您不需要这些键,例如fillAccountNameBox方法。 2)在泛型上添加类型是一种很好的做法。 * HashMap *而不是在没有它们的情况下保留_HashMap_ –

2

你的地图包含你想要它包含的内容。问题在于你如何访问它。

正如你所指出的,在你的映射中的键如下:

[Bob Dole, John Doe, Jack Black] 

在最终for循环,你正在寻找访问映射到按键012值。由于这些密钥不存在于您的地图中,因此您将获得null