早上好,
我正在做一些Java练习,偶然发现了这个问题。 我有一个.txt文件,其中包含多个数字,每行一个。 练习的目的是查看哪些数字等于10 ^ 0,...,10 ^ n直到达到n。 然后,我必须在.txt中写入每个数字出现多少次。
所以我有一个文件:
1个
100
100
100
10
1个
1个
我需要写:
1-10
3-1
3-100
我可以读取文件,然后检查编号并打印。 我只是想不通如何正确地做一个计数器。 有什么帮助吗?
这是一段代码:
// TODO - Count how many time a number appears.
public static void numberOfTimes (BufferedReader in, BufferedWriter out, int n) throws IOException {
String s;
int i;
int counter = 0;
while ((s = in.readLine()) != null) {
i = Integer.parseInt(s);
for (int j = 0; j <= n; j++) {
if (i == Math.pow(10, j)) {
counter++;
out.write(Integer.toString(counter) +"" + Integer.toString(i) +"
");
}
}
}
}
所以您只需要计算1、10、100、1000等数字? 换句话说,源文件中可以有数字45吗?
是的,源文件中混合了很多数字。 我只需要给定某个n,然后检查所有这些,看看哪些是10 ^ 0到10 ^ n并计数。
由于要跟踪多个计数,因此单个整数计数器显然不够用。
一种可能性是使用Map进行计数。 因为这是家庭作业,所以我留给您找出细节。
另一种可能性是使用一个计数数组,并使用log10(i)作为该数组的索引。 换句话说,10^k的计数将存储在数组的第k个位置。 提示:在您的代码中,您已经在间接计算log10(i)。
log10创意为+1,这在特定情况下适用,但不适用于任何数字(与映射始终有效的地图不同)。
或者您可以只使用字符串长度-1(=零个数)
嗡嗡声,从未使用过或听说过$ Map ,但我将介绍一下API。
我当时是这样想的:将所有找到的值存储在一个数组中,然后针对每个数组查找数组。 如果发现例如3 10 ^ 0,则counter1 = 3,counter1 = 2,依此类推2,等等。但这看起来效率很低,我希望有一个更简洁,更简短的解决方案。 感谢您的所有答复。
由于您正在处理Integer,因此可以预加载所有小于Integer.MAX(2,147,483,647)的值的Map。
映射将需要10 ^ 0,10 ^ 1,...,10 ^ 9中的所有值作为键(总共十(10)个键)。 然后,您需要对读取的值进行布尔检查,如果与这些键之一匹配,则将该键的值加1。