从文件中读取行,并操纵每行中的单个单词?

时间:2010-09-03 19:25:33

标签: java

我正在尝试读入.txt文件并创建一个映射来计算每个代理ID的美元和美分列出的总属性。代理ID是每行末尾的三位数字。问题是,我不确定如何去做这件事。

我在想我应该创建一个while循环并将每一行添加到一个arraylist,然后.....我迷路了。

110001 commercial 500000.00 101
110223 residential 100000.00 101
110333 land 30000.00 105
110442 farm 200000.00 106
110421 land 40000.00 107
112352 residential 250000.00 110

好的,我知道自从我开始这个帖子以来已经有很长一段时间了,但是我已经好几周都没有能够重新审视这个问题了。 (我试图通过个人成长来学习这个,所以它没有被优先考虑)到目前为止,我已经走到了这一步......

我创建地图的方法是:

public void createMap()
{
    if(in != null)
    {
        while(in.hasNextLine())
        {
            String s = in.nextLine().trim();
            System.out.print(s);


            String[] p = s.split(" ");

            String agentId = p[3];

            double property = Double.valueOf(p[2]);

            if(!map.containsKey(agentId)){
                //if not then add the new key with new value
                map.put(agentId, property);
                in.nextLine();
            }
            else
            {  //if key is present, add the value..
                map.put(agentId, map.get(agentId) + property);
                in.nextLine();
            }


        }
    }
}

然后在我正在运行的程序中: 我将map转换为Set并使用增强的for循环打印每个键和值。

Set<String> keySet = examp.map.keySet();
    for (String key : keySet)
    {
        double value = examp.map.get(key);
        System.out.println(key + "->" + value);
    }

我的输出却给了我这个:{}“空括号”! 我做错了什么?

4 个答案:

答案 0 :(得分:2)

从文件中读取数据后,这些选项可能是解析字符串的最简单方法。

这是解析字符串的内置Java方式。 http://download-llnw.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)

这是一种在Java中解析字符串但仍然有效的传统方法。 http://download.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html

使用StringTokenizer的实现示例。 http://www.mkyong.com/java/java-stringtokenizer-example/

像其他评论家所说,只是尝试一下。当你是一个初学者时,最好的学习方法就是亲自动手。当然,你会犯错并抛弃代码,但你会在这个过程中学到很多东西。

答案 1 :(得分:1)

如果你有一个arraylist,你可以这样做:

HashMap<String, Integer> result = new HashMap<String, Integer>(); //<agent id, amount>
for(String line: arraylist)
{
    String[] items = line.split(" ");
    String agent = items[3];
    double amount = Double.valueOf(items[2]);

    if(!result.containsKey(agent)
        result.put(agent, amount);
    else
        result.put(agent, result.get(agent) + amount);
}

您可以遍历哈希映射的键以获得结果。

答案 2 :(得分:1)

  1. 打开文件:

    String pFile = "input.txt";
    BufferedReader in;
    try {
        in = new BufferedReader(new FileReader(pFile));
    } catch (FileNotFoundException ex) {
        System.out.println("File Not Found");
        return;
    }
    
  2. 声明HashMap:

    HashMap<String, Double> map = new HashMap<String, Double>(); //<agent id, amount>
    
  3. 读取行,解析它们并添加到Hash-Map:

    String line;
    
    //loop till end of file
    while((line = in.readLine()) != null) {
        //remove spaces from front and back...
        line = line.trim();
    
        //ignore if line is empty
        if(line.isEmpty())
            continue;
    
        //split line into array
        String[] p=line.split(" ");
    
        //now according to your input-file's first line
        //p[0]="110001"
        //p[1]="commercial"
        //p[2]="500000.00"
        //p[3]="101"
        //so do whatever you want.
    
        String agentId = p[3];
    
        //Parse the string to double.
        double property = Double.valueOf(p[2]);
    
        //Check if hash already contains key.
        if(!map.containsKey(agentId))
            //if not then add the new key with new value
            map.put(agentId, property);
        else
            //if key is present, add the value..
            map.put(agentId, map.get(agentId) + property);
        }
    

答案 3 :(得分:1)

我宁愿不通过编码整个事情来破坏你的乐趣。但我建议首先将其分解为函数,并决定你希望每个函数做什么。

例如,拥有这样的函数会很好:

Map<String, java.math.BigDecimal> calculatePropertyAmounts(List<String> lines)

并且有一个能从一行获得属性数量的函数会很好,例如:

java.math.BigDecimal readAmountFromLine(String line)

同样

String readAgentIdFromLine(String line)

也许像是

List<String> readLinesFromFile(String filename)

我显然错过了一些,但这是一般的想法。一旦你将它分解成碎片,你就可以单独征服它们,然后用它们组装一个解决方案。