我正在开发一个Java程序,其目的是以特定方式解析它。
在某一点上,我需要根据过去n(例如)行中的alorithem添加某些值:
private void eFSF(PFCC pfCC, csvReader reader) {
List<List<String>> fileDataList;
reader.changeModulo(1);
fileDataList = reader.parseToList();
HashMap<Long, List<String>> hashedList = new HashMap<>();
long rowCnt = 0L;
for (List<String> list : fileDataList) {
hashedList.put(rowCnt, list);
rowCnt++;
}
AWI wI = getWI(pfChainContext, fileDataList);
hashedList.get(0L).add(setFeatureHeader());
//iterate over without header
long iterCnt = 1L;
long moduloCnt = 0L;
LinkedList<Long> lastLines = new LinkedList<>();
for (Long line : hashedList.keySet()) {
if (line == 0L)
continue;
// check measure start, first measurement
if (hashedList.get(line).get(1).equals("0")) {
moduloCnt = 0L;
}
if( moduloCnt % pfChainContext.getEsize() == 0 || pfChainContext.size() == 1){
if (lastLines.size() != 0) { //prob first line
moduloTrigger(hashedList, wIter, lastLines);
//clean Data
lastLines.clear();
wIter.clear();
}
}
wIter.addLine(hashedList.get(line));
lastLines.add(iterCnt);
moduloCnt++;
iterCnt++;
}
// if some "hangover" lines exist:
if (lastLines.size() != 0) {
moduloTrigger(hashedList, wIter, lastLines);
}
//write File Back
...
}
private void moduloTrigger(HashMap<Long, List<String>> fileDataList, AWI wIter, LinkedList<Long> lastLines) {
fileDataList.get(lastLines.getFirst()).add((String)wIter.getDFCW());
//fill with zeros
for (Long i : lastLines.subList(1, lastLines.size()))
fileDataList.get(i).add("0");
}
一般情况下,algorithem工作正常。但我遇到以下问题: 在~65536th Line之后,一些数据错误一步。
我很确定这与变量限制有关,但将数字更改为Long并没有改变这种情况。 在发现代码后我发现,问题已存在于数据结构中,因此它与写回数据无关。
我正在使用64位Java的64位计算机。
有没有人知道他为什么一直搞乱这些台词?
答案 0 :(得分:1)
65536是无法表示为Java char
的最小值。所有其他类型都有较小的限制(byte
为127,short
为32767)或显着更大。
byte
已签署8b short
已签署16b char
是16b unsigned int
已签署32b long
已签署64b float
是32b签名浮动,所以23b尾数double
是64b签名浮动,所以52b尾数但将数字更改为Float
将积分类型更改为Float
不会让您将其更改为更大的整数类型。
我正在使用64位Java的64位计算机。
这会影响可寻址内存的数量和对象引用所消耗的内存量,但不会影响Java中数字基元的位宽。