我正在尝试读入.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);
}
我的输出却给了我这个:{}“空括号”! 我做错了什么?
答案 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)
打开文件:
String pFile = "input.txt";
BufferedReader in;
try {
in = new BufferedReader(new FileReader(pFile));
} catch (FileNotFoundException ex) {
System.out.println("File Not Found");
return;
}
声明HashMap:
HashMap<String, Double> map = new HashMap<String, Double>(); //<agent id, amount>
读取行,解析它们并添加到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)
我显然错过了一些,但这是一般的想法。一旦你将它分解成碎片,你就可以单独征服它们,然后用它们组装一个解决方案。