我正在编写一个方法,它将从文本文件中读取并告诉该文本文件中有多少人在1920年至1984年期间出生,但由于某种原因,它只会存储最多45行。< / p>
private Buffin itsFile = new Buffin("workers.txt");
private static final int TIME_SPAN = 65;
private static final int YEAR = 1920;
public String countBirthYears()
{
try
{
int[] count = new int[TIME_SPAN];
//== READ THE WORKER DATA AND UPDATE THE COUNTS
Worker data = new Worker(itsFile.readLine());
while(data.getName() != null)
{
if((data.getBirthYear() - YEAR) >= 0 && (data.getBirthYear() - YEAR) <= 1984){
int lastDigit = data.getBirthYear() % 10;
count[lastDigit]++;
}
data = new Worker(itsFile.readLine());
}
//== CONSTRUCT THE STRING OF ANSWERS
String s = "";
for(int k = 0; k < TIME_SPAN; k++)
s += (YEAR + k) + " : " + count[k] + " workers\n";
return s;
}catch(Exception e){JOptionPane.showMessageDialog(null, e); return "";}
}
如果有人能向我解释为什么会发生这种情况以及如何解决这个问题,我将不胜感激。谢谢:))
答案 0 :(得分:2)
嗯,实际上这不是一个真正的答案,但我想在你的代码中解决一些问题,我希望它可以帮助你:
1
if((data.getBirthYear() - YEAR) >= 0 && (data.getBirthYear() - YEAR) <= 1984)
实际上并不检查1920年和1984年的出生年份,但它包括1920年至3904年之间的所有年份
我认为你的意思是:
if((data.getBirthYear() - YEAR) >= 0 && (data.getBirthYear() - YEAR) <= TIME_SPAN)
2
int lastDigit = data.getBirthYear() % 10;
count[lastDigit]++;
实际上将1973年出生的人和1983年出生的人加起来......这就是你真正想要的吗?
也许问题不在字符串限制中,但逻辑中可能存在某些内容......
答案 1 :(得分:0)
String的大小在Java中是有限的。 String对象可以容纳的字符数实际上等于Integer.MAX_VALUE
。如果超过这个长度,您应该考虑使用StringBuffer
或StringBuilder
来创建输出,如果您在不同的线程中使用它(StringBuffer已同步)。
您可以使用
StringBuffer sb = new StringBuffer();
for(int k = 0; k < TIME_SPAN; k++)
s.append(YEAR + k).append(" : ").append(count[k]).append(" workers\n");
return sb; //sb.toString();
注意:如果您的堆大小较小,则可能会受到更多限制。字符串最大值
长度为Integer.MAX_VALUE
或堆大小的一半,以较小者为准。
答案 2 :(得分:-1)
是的,字符串是有限的。据我记得,限制取决于JVM,就像64K。
但它甚至无关紧要。您不必将整个文件读入一个字符串,以检测有多少人符合您的条件。即使字符串大小没有限制。如果您的文件包含所有70亿人的列表怎么办?你想在内存中保留整个列表只是为了在运行结束时返回一个简单的计数器吗?
您必须逐行读取文件,解析每一行并在需要时递增计数器。无需将整个信息存储在RAM中。