在下面的代码中,我只是想计算一个项目出现在文件中的次数。但是,当我打印出键及其值时,我得到的计数实际上是一个。当我将total
初始化为0时,它解决了问题,但我不确定原因。
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
public class Problem {
public static void main(String[] arg) {
HashSet QID = new HashSet();
HashMap QIDToCorrect = new HashMap();
try {
// Open the file that is the first command line parameter
FileInputStream fstream = new FileInputStream(
"C:/Users/lol/Downloads/data.csv");
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
//Read File Line By Line
String strLine;
br.readLine(); //skip header line
int total = 0;
int blah = 0;
while ((strLine = br.readLine()) != null) {
String[] split = strLine.split(",");
if (!QID.contains(split[0])) {
total = 1;
QID.add(split[0]);
QIDToCorrect.put(split[0], total);
} else {
total += 1;
QIDToCorrect.put(split[0], total);
}
//System.out.println();
}
} catch (Exception e) {
}
}
}
答案 0 :(得分:0)
你的算法看起来很奇怪,但如果我理解你正在尝试做什么,我会替换
if (!QID.contains(split[0])) {
total = 1;
QID.add(split[0]);
QIDToCorrect.put(split[0], total);
} else {
total += 1;
QIDToCorrect.put(split[0], total);
}
与
Integer lasttotal = (Integer)QIDToCorrect.get(split[0]);
total = 1 + lasttotal!=null ? lasttotal : 0;
QID.add(split[0]);
QIDToCorrect.put(split[0], total);
这样,总计会正确计算您的项目,即使它们没有排序......但是,这并不能解释您的问题。您确定正确打印了值吗?您是否尝试过逐步调试?
答案 1 :(得分:0)
在更新密钥之前,您需要获取密钥的值...请参阅下文:
if (!QID.contains(split[0])) {
total = 1;
QID.add(split[0]);
QIDToCorrect.put(split[0], total);
} else {
total = QIDToCorrect.get(split[0]); // RETRIEVE VALUE FOR KEY
total += 1;
QIDToCorrect.put(split[0], total);
}
答案 2 :(得分:0)
假设您输入每行的第一个元素如下:
foo
foo
bar
foo
现在让我们考虑一下你的循环对这个输入的作用
while((strLine = br.readLine())!= null){
String[] split = strLine.split(",");
split[0]
是第一个“foo”。
if (!QID.contains(split[0])) {
“foo”尚未添加
total = 1;
QID.add(split[0]);
QIDToCorrect.put(split[0], total);
total
设置为1
,“foo”已添加到QID
并且(“foo”,1)已添加到QIDToCorrect
String[] split = strLine.split(",");
split[0]
是第二个“foo”
if (!QID.contains(split[0])) {
评估为false,因此if
语句会落入else
。
} else {
total += 1;
QIDToCorrect.put(split[0], total);
}
total
递增为2,QIDToCorrect
更新为(“foo”,2)。
String[] split = strLine.split(",");
split[0]
现在包含“bar”。
if (!QID.contains(split[0])) {
total = 1;
QID.add(split[0]);
QIDToCorrect.put(split[0], total);
QID
不包含栏,因此total
重置为1,“bar”添加到QID
,(“bar”,1)插入{{1 }}
QIDToCorrect
现在 String[] split = strLine.split(",");
包含第三个“foo”
split[0]
之前已经看过“foo”,所以请到 if (!QID.contains(split[0])) {
。
else
} else {
total += 1;
QIDToCorrect.put(split[0], total);
}
增加到2,total
更新为(“foo”,2)。
因此,持有计数器的地图认为只有两个 QIDToCorrect
。我在这看到一个问题。每次看到新项目时,foo
计数器都会重置。因此,当您致电total
时,您不会考虑过去看过该项目的次数。您可能需要使用QIDToCorrect.put()
才能获得项目的先前计数。这样就不需要QIDToCorrect.get()
变量(除非你想知道你看过的所有项目的总数)。此外,total
HashSet是不必要的,因为您可以查询QID
是否已包含密钥。