计算java数组中的出现次数
问题是:编写一个程序,读取1-100之间的整数,并统计每个整数的出现次数。假设输入以0结尾。如果数字出现不止一次,则在输出中使用复数“times”。以下是该程序的运行示例: 2出现2次计算java数组中的出现次数,java,Java,问题是:编写一个程序,读取1-100之间的整数,并统计每个整数的出现次数。假设输入以0结尾。如果数字出现不止一次,则在输出中使用复数“times”。以下是该程序的运行示例: 2出现2次 3发生1次 4发生1次 5出现2次 6发生1次 23发生1次 43发生1次 我已经在代码中修复了读取整数,不再是I,而是一个单独的变量“index”,并理解了为什么我会收到越界异常,但我有点笨,不知道如何在添加sentinel值0的同时修复它 import java.util.Scanner; public c
3发生1次
4发生1次
5出现2次
6发生1次
23发生1次
43发生1次 我已经在代码中修复了读取整数,不再是I,而是一个单独的变量“index”,并理解了为什么我会收到越界异常,但我有点笨,不知道如何在添加sentinel值0的同时修复它
import java.util.Scanner;
public class countNumberOccurrence{
public static void main(String args[]){
int[] numbers = new int[100];
inputArray(numbers);
}
public static void inputArray(int[] myList){
Scanner input = new Scanner(System.in);
System.out.print("Enter integers from 1-100 (input 0 value to end inputs): ");
int index = 0;
for(int i = 1; i < myList.length - 1; i++){
if(i > 0){
index = input.nextInt();
myList[index-1]++;
}
if(myList[index-1] > 1)
System.out.println(index + " occurs " + myList[index-1] + " times ");
else
System.out.println(index + " occurs " + myList[index-1] + " time ");
}
}
}
import java.util.Scanner;
公共类countnumberrocurrence{
公共静态void main(字符串参数[]){
整数[]个数=新整数[100];
输入阵列(数字);
}
公共静态void输入阵列(int[]myList){
扫描仪输入=新扫描仪(System.in);
系统输出打印(“输入1-100之间的整数(输入0值到结束输入):”;
int指数=0;
for(int i=1;i0){
index=input.nextInt();
myList[index-1]++;
}
如果(myList[index-1]>1)
System.out.println(索引+“发生”+myList[index-1]+“次数”);
其他的
System.out.println(索引+“发生”+myList[index-1]+“时间”);
}
}
}
我认为您的问题在于:
if(myList[index-1] > 1)
System.out.println(index + " occurs " + myList[index-1] + " times ");
如果索引为0,您将尝试访问超出边界的数组的-1元素。请尝试以下方法:
if(index>0){
if(myList[index-1] > 1)
System.out.println(index + " occurs " + myList[index-1] + " times ");
}
else
System.out.println(index + " occurs " + myList[index-1] + " time ");
}
这样,如果您的索引为0,则该行不会尝试访问-1元素。因为您在注释中说,您无法使用正确的惯用方式:
检测0
输入并结束应用程序的正确逻辑为:
int nextInt;
while ((nextInt = input.nextInt()) != 0)
{
// do your logic here
}
// print your output here
这是处理输入的正确方法
如果不需要,请不要使用原始阵列!
始终使用适当的类并使用for/each
或适当的迭代器进行迭代,这样就不会出现这些一次性错误
你要找的东西叫做多重地图
以下是一个仅适用于JDK的解决方案:
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
public class Q21871053
{
public static void main(final String[] args)
{
final Random rnd = new Random();
final Map<Integer, AtomicInteger> counter = new HashMap<Integer, AtomicInteger>()
{
@Override
public AtomicInteger get(final Object key)
{
if (!super.containsKey(key)) { super.put((Integer) key, new AtomicInteger(rnd.nextInt(100))); }
return super.get(key);
}
};
final AtomicInteger nextInt = new AtomicInteger(rnd.nextInt(100));
while (nextInt.get() != 0)
{
counter.get(nextInt.get()).incrementAndGet();
if (counter.size() > 1000) { nextInt.set(0); } // limit the run to 1000 numbers
else { nextInt.set(rnd.nextInt(100)); }
}
for (final Integer i : counter.keySet())
{
final AtomicInteger integer = counter.get(i);
final String format = integer.get() > 1 ? "%d occurs %s times\n" : "%d occurs %s time\n";
System.out.format(format, i, integer);
}
}
}
谷歌番石榴有一个很好的
Jarrod给出了一个很好的答案,但如果你有特定的作业规范,一定要列出它们
编辑了这篇文章,很抱歉弄错了。未在if块中指定索引。当用户输入0到结束输入时,会出现越界问题。即使用户已完成,也会尝试插入到数组中。所以放一个if语句来检查0
int index = 0;
for(int i = 1; i < myList.length - 1; i++){
if(i > 0){
index = input.nextInt();
if (index > 0 && index < myList.length)
myList[index-1]++;
else
break;
}
int索引=0;
for(int i=1;i0){
index=input.nextInt();
如果(索引>0&&index
现在这会起作用,但不是最好的样式。for循环不是最好的选择,因为您不知道用户将输入多少个数字。这将解决您的越界问题,但您的实现中还有一些其他问题。请先解决此问题,然后处理其余代码。package deneme;
package deneme;
import java.util.Scanner;
public class CountOccuranceNumbers {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int[] number = new int[100];
System.out.print("Enter the integers between 1 and 100: ");
for (int i = 0; i < number.length; i++) {
int a = input.nextInt();
number[a] += a;
if (a == 0)
break;
}
for (int i = 1; i < number.length; i++) {
if (number[i] != 0) {
if (number[i] / i > 1)
System.out.println(i + " occurs " + number[i] / i + " times");
else
System.out.println(i + " occurs " + number[i] / i + " time"); }
}
}
}
导入java.util.Scanner;
公共类CountOccuranceNumbers{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
扫描仪输入=新扫描仪(System.in);
int[]编号=新int[100];
System.out.print(“输入介于1和100之间的整数:”);
for(int i=0;i1)
System.out.println(i+“发生”+次数[i]/i+“次数”);
其他的
System.out.println(i+“发生”+number[i]/i+“时间”);}
}
}
}
公共类q7{
公共静态void main(字符串[]args){
int arr[]={6,22,20,11,5,18,18,16,30,9,10,10,11,5,18,18,16};
对于(int i=0;i
如果将整个块包装在if(index>0)中,则我的打印代码中的myList[index-1]会出现越界异常正如我在上面的例子中所做的那样,这应该可以防止我不能在我的类赋值中使用类似的东西,基本上我只需要修改我的代码来添加一个0的哨兵值,并将我的读取整数或索引恢复到1-100之间。如果你正在为一家公司做一个项目,或者被要求这样做,那么这就是你的方法这是在一次采访的白板上看到的。感谢所有人的反对票,感谢他们学习了在纯Java和Guava库中实现这一点的惯用方法。我遇到的越界问题来自尝试输入一个0值,该值将索引设置为0,因此产生了问题。我不知道如何创建一个0的工作哨兵值要结束用户的输入,但增加其他的数字。出错了,检查编辑。欢迎使用。请用四个空格缩进代码以使它显示得很好。请参阅更多信息。如果您想改进答案,请考虑在代码中添加散文,以解释为什么您的建议解决了问题以及它是如何解决的。e解释解决方案:(
int index = 0;
for(int i = 1; i < myList.length - 1; i++){
if(i > 0){
index = input.nextInt();
if (index > 0 && index < myList.length)
myList[index-1]++;
else
break;
}
package deneme;
import java.util.Scanner;
public class CountOccuranceNumbers {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int[] number = new int[100];
System.out.print("Enter the integers between 1 and 100: ");
for (int i = 0; i < number.length; i++) {
int a = input.nextInt();
number[a] += a;
if (a == 0)
break;
}
for (int i = 1; i < number.length; i++) {
if (number[i] != 0) {
if (number[i] / i > 1)
System.out.println(i + " occurs " + number[i] / i + " times");
else
System.out.println(i + " occurs " + number[i] / i + " time"); }
}
}
}
public class q7 {
public static void main(String[] args) {
int arr[] = {6, 22, 20, 11, 5, 18, 18, 16, 30, 9, 10, 10, 11, 5, 18, 18, 16};
for (int i = 0; i < arr.length; i++) {
int count = 0;
for (int j = 0; j < arr.length; j++) {
if (arr[i] == arr[j])
count++;
}
System.out.println(arr[i] + "\toccures\t" + count + " times");
}
}
}