当前位置: 首页 > 知识库问答 >
问题:

循环执行Java时的IndexOutOfBoundsException

金何平
2023-03-14
package com.cp.javapractice;

import java.util.ArrayList;
import java.util.Scanner;

public class Cp {
public static void main(String args[]) {
    ArrayList al = new ArrayList();
    Scanner s = new Scanner(System.in);
    String str = null;
    str = new String();
    System.out.println("Enter the string which you want to remove the     duplicates");
    str = s.nextLine();
    String arr[] = str.split(" ");
    for (int k = 0; k < arr.length; k++) {
        al.add(arr[k]);
    }
    try {
        for (int i = 0; i < arr.length; i++) {

            for (int j = i + 1; j < arr.length; j++) {

                if (arr[i].equalsIgnoreCase(arr[j])) {
                    al.remove(j);
                }
            }
        }
        System.out.println(al);
        } 
    catch (Exception e) {
        System.out.println(e);
    }
}
}

我将替换用户在特定给定字符串中重复的单词。因此,我使用split方法将给定的字符串用空格拆分,并将其放入数组和arraylist中。

迭代通过数组并检查条件后,它是平等的,然后我删除了ArrayList。但是在删除它时,它显示索引出界异常

此代码适用于小数组大小,但在给出大量数组大小时显示异常。我有问题,而我给字符串的数组大小为13个字。

这是我的全部代码。

共有3个答案

董翰墨
2023-03-14

问题是你的第二个循环。是从i 1开始的。但i是从0到长度-1。因此,最后一个ein将是j=length-1,它超出了数组长度。

因此,将第一个for循环更改为:

for(int i=0;i < arr.length-2;i++)
孟胤
2023-03-14

异常是因为您使用的是arr.length而不是al.size()。对于每次删除,arraylistal的大小都会减小。因此,您必须考虑使用数组列表的大小而不是数组的大小。

for (int i = 0; i < al.size(); i++) { // change arr.length to al.size()

            for (int j = i + 1; j < al.size(); j++) { // change arr.length to al.size()

                if (arr[i].equalsIgnoreCase(arr[j])) {
                    al.remove(j);

                }
            }
        }

我建议您查看HashSetTreeSet,这样可以减少删除重复项的工作量。

HashSet中实现:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;


public class Cp {
public static void main(String args[]) {

    Scanner s = new Scanner(System.in);
    String str = null;
    str = new String();
    System.out.println("Enter the string which you want to remove the     duplicates");
    str = s.nextLine();
    String arr[] = str.split(" ");

    Set<String> ts = new HashSet<String>(Arrays.asList(arr)); // -> added only this line

        System.out.println(ts);

}
}
郑博
2023-03-14
for (int i = 0; i < al.size(); i++) {

    for (int j = i + 1; j < al.size(); j++) {

        if (al.get(i).equals(al.get(j)) { 
            al.remove(j);
        }
    }
}
 类似资料:
  • 本文向大家介绍C#中for循环、while循环循环执行的方法,包括了C#中for循环、while循环循环执行的方法的使用技巧和注意事项,需要的朋友参考一下 先给大家介绍下C#中的循环执行for循环 在这一节练习中,我们向大家介绍一下C#中的另一种重要的循环语句,for循环。 表达式1:一般为赋值表达式,给控制变量赋初值; 表达式2:逻辑表达式,循环控制条件;当条件为真时,循环执行循环体中的语句。

  • 问题内容: 我很难弄清楚为什么while循环实际上不会循环。它运行一次并停止。 我正在尝试使其循环,以便用户能够多次转换单位。任何帮助都欢迎! 问题答案: 问题在于,当您呼叫时,它会占用该号码,但不会占用该号码之后的换行符。要解决此问题,只需在调用后放一行代码。 示例和完整说明: 假设您输入“ km”,按回车,“ 123”,按回车。从程序的角度来看,输入流为。 该代码获取值,并且使输入超出第一个。

  • 问题内容: 有没有办法知道在Java中执行一个循环要花多少秒? 例如: 它不必精确到100%,而只是想知道要花费多长时间。里面的算法是一种写入.txt文件的密钥生成器。我希望它花费几分钟,因此对于我的第一次测试,我想计算秒数。 问题答案: 用Java编写微基准测试时需要非常小心。例如: 如果JIT编译器可以弄清楚循环体不影响代码结果,则可以对其进行优化。例如: 可能很快就会“运行”。 JIT编译后

  • 主要内容:系统的crontab设置前面学习了 at 命令,此命令在指定的时间仅能执行一次任务,但在实际工作中,系统的定时任务一般是需要重复执行的。而 at 命令显然无法满足需求,这是就需要使用   crontab 命令来执行循环定时任务。 在介绍 crontab 命令之前,我们首先要介绍一下 crond,因为 crontab 命令需要 crond 服务支持。crond 是 Linux 下用来周期地执行某种任务或等待处理某些事件的一

  • 问题内容: 我已经编写了一个包含循环的“ Hangman”游戏,不断询问用户字母,直到他们解决单词或耗尽生命。奇怪的是,在满足条件时循环不会停止。 这是包含循环的游戏逻辑的实现: 可变结果是从方法中获取返回值。这是实现。 难道是我返回导致循环不断循环的值的方式吗?我这样声明了这些值: 问题答案: 逻辑上,根据德摩根定律, 是相同的 这永远是一个真实的表达。 条件可能应该是 当应用与上述相同的法律时