Java: Trying to print out most frequent numbers in a string keeps returning an exception(Java:尝试打印字符串中最频繁的数字时总是返回异常)
问题描述
我正在尝试编写一个程序,该程序接收一些命令行参数,将它们保存为字符串,并查找该字符串中最频繁的数字(它必须忽略字母和其他符号,只检查数字)。然后,它应该打印字符串、最频繁的数字以及它在该字符串中出现的次数。如果两个或多个数字在一个字符串中出现的次数相同,则应按升序写入这两个数字。
输入:13355
所需输出:‘13355’->;3 5(2)
但我的程序一直返回一个异常:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
at java.base/java.util.ArrayList.rangeCheckForAdd(ArrayList.java:788)
at java.base/java.util.ArrayList.add(ArrayList.java:513)
at com.company.trying6.main(trying6.java:45)
我尝试了这些循环中的不同循环和条件,但找不到如何修复它。
import java.util.*;
public class trying6 {
public static void main(String[] args) {
//string of arguments
String s = "";
if (args.length != 0) {
for (int i = 0; i < args.length; i++) {
s = s + args[i] + " ";
}
}
ArrayList<Character> maxTimesNum = new ArrayList<Character>(); //I will write most frequent number into this
ArrayList<Integer> numRepeats = new ArrayList<Integer>(); // to save repeats of each number
int maxTimesNumRepeats = 0;
//int index = 0;
int indexInt = 0;
//Counting and saving repetitions of numbers
for (int i = 0; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
char x = s.charAt(i);
int xRepeats = 0;
for (int k = 0; k < s.length(); k++) {
if (s.charAt(k) == x) {
xRepeats = xRepeats + 1;
}
}
numRepeats.add(indexInt, xRepeats);
indexInt++;
}
}
// I think an issue forms here but i don't know how to fix it
for (int index = 0; index < numRepeats.size(); index++) {
int second = index +1;
if (numRepeats.get(second) > numRepeats.get(index)) {
maxTimesNum.add(index, s.charAt(second));
maxTimesNumRepeats = numRepeats.get(second);
} else if (numRepeats.get(second) == numRepeats.get(index)) {
if (!maxTimesNum.contains(s.charAt(second))) {
maxTimesNum.add(index, s.charAt(second));
}
}
}
if (maxTimesNumRepeats > 0) {
System.out.print("'" + s.trim() + "'" + " -> ");
for (int t = 0; t < maxTimesNum.size(); t++) {
System.out.printf("%c ",maxTimesNum.get(t));
}
System.out.printf("(%d)
", maxTimesNumRepeats);
} else {
System.out.println("The string " + "'" + s + "'" + " has no numbers.");
}
}
}
推荐答案
我认为有更好的方法来按O(N)的顺序实现您想要的结果,使用带有<;字符、整数和>的映射
不过,代码的问题似乎出在第44-45行,maxTimesNum.add(index, s.charAt(second));
我已经添加了一些Souts,看起来您正在尝试添加到索引2,而它必须添加到索引1,因为列表的大小只有1(元素在索引0)
输出:
循环0中的索引, MaxTimesNum 0的大小 循环2中的索引, MaxTimesNum%1的大小 线程中出现异常:索引:2,大小:1 在java.base/java.util.ArrayList.rangeCheckForAdd(ArrayList.java:756) 在java.base/java.util.ArrayList.add(ArrayList.java:481) 在try ing6.main(trying6.java:46)这篇关于Java:尝试打印字符串中最频繁的数字时总是返回异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java:尝试打印字符串中最频繁的数字时总是返回
基础教程推荐
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- 降序排序:Java Map 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01