将.txt文件读入Hashmap并对其进行操作

时间:2017-03-26 22:43:19

标签: java file-io hashmap

这里我最大的问题很可能不是完全理解Hashmaps以及如何操作它们,尽管看了一些教程。希望你明智的灵魂能够指引我走上正轨。

我试图将.txt文件读入hashmap。该文本文件包含2006年名称的流行度.inputFile的每一行都包含一个男孩名称和一个女孩名称,以及有多少名称。例如:1 Jacob 24,797 Emily 21,365将是第1行文件的输入。

我想将男孩名字放在一个列表中,女孩们将名字放在第二个列表中,保持他们当前的位置,这样用户就可以搜索雅各布并被告知那是当年的1号男孩名字,依此类推换其他名字。以前我只是逐行读取文件,看看文件中包含我正在搜索的名称的行。这很有效,但它无法判断这是男孩名字还是女孩名字,导致错误,如果我说我正在寻找雅各布对女孩来说有多受欢迎,它仍然会说1号。我确定了一个hashmap会是解决这个问题的最佳方法,但却无法真正发挥作用。

我的代码

public void actionPerformed(ActionEvent e)
    {
        //Parse Input Fields
        String name = inputArea.getText();
        if (name.equals(""))
        {
            JOptionPane.showMessageDialog(null, "A name is required.", "Alert", JOptionPane.WARNING_MESSAGE );
            return;
        }
        String genderSelected = genderList.getSelectedItem().toString();
        String yearSelected = yearList.getSelectedItem().toString();

        String yearFile = "Babynamesranking"+yearSelected+".txt";    //Opens a different name file depending on year selection    
        boolean foundName = false;
        Map<String, String> map = new HashMap<String,String>(); //Creates Hashmap

        try
        {
            File inputFile = new File(yearFile);                    //Sets input file to whichever file chosen in GUI
            FileReader fileReader = new FileReader(inputFile);      //Creates a fileReader to open the inputFile
            BufferedReader br = new BufferedReader(fileReader);     //Creates a buffered reader to read the fileReader

            String line;
            int lineNum = 1;                                        //Incremental Variable to determine which line the name is found on
            while ((line = br.readLine()) != null)
            {
                if (line.contains(name))
                {
                    outputArea.setText(""+name+" was a popular name during "+yearSelected+".");
                    outputArea.append("\nIt is the "+lineNum+" most popular choice for "+genderSelected+" names that year.");
                    foundName = true;
                }
                String parts[] = line.split("\t");
                map.put(parts[0],parts[1]);

                lineNum++;
            }
            fileReader.close();
        }
        catch(IOException exception)
        {
            exception.printStackTrace();
        }

        String position = map.get(name);
        System.out.println(position);
}

示例inputFile:

1   Jacob   24,797  Emily   21,365
2   Michael 22,592  Emma    19,092
3   Joshua  22,269  Madison     18,599
4   Ethan   20,485  Isabella    18,200
5   Matthew 20,285  Ava     16,925
6   Daniel  20,017  Abigail     15,615
7   Andrew  19,686  Olivia  15,474
8   Christopher 19,635  Hannah  14,515

2 个答案:

答案 0 :(得分:0)

你需要两个哈希图,一个用于男孩名字,另一个用于女孩名字 - 目前你正在使用男孩名字作为键,女孩名字作为值,这不是你想要的。相反,使用两个Map<String, IntTuple>数据结构,其中String是名称,IntTuple是行号(排名)和具有此名称的人数。

class IntTuple {
  final int rank;
  final int count;

  IntTuple(int rank, int count) {
    this.rank = rank;
    this.count = count;
  }
}

答案 1 :(得分:0)

嗯,问题在于使用

if (line.contains(name))

您要检查整个行中是否存在该名称,以及该名称是男孩的名字还是女孩的名字。您可以做的是单独阅读它们,然后决定要检查的值。你可以这样做:

while ((line = br.readLine()) != null)
{
    Scanner sc = new Scanner(line);
    int lineNumber = sc.nextInt();
    String boyName = sc.next();
    int boyNameFreq = sc.nextInt();
    String girlName = sc.next();
    int girlNameFreq = sc.nextInt();

    if(genderSelected.equals("male") && name.equals(boyName)){
        // .. a boy's name is found
    }
    else if(genderSelected.equals("female") && name.equals(girlName)){
        // .. a girl's name is found
    }

}

扫描程序类用于解析行,并逐个令牌读取,因此您可以知道该名称是否适用于男孩或女孩。然后检查您只需要的名称。