我该如何解决这个异常呢

时间:2014-04-22 21:58:09

标签: java arraylist java.util.scanner indexoutofboundsexception

这是我的代码,用于区分两个txt文件之间的差异。唯一的问题是如果我不从arrayList中减去1,我会得到一个越界异常,所以现在它没有为所有元素运行,我该如何解决这个问题?

import java.io.*;
import java.util.*;

public class myfilereader
{
    public static void main (String[] args) throws java.io.IOException
    {

        int temp = 0;
        ArrayList<String> ArrayList1 = new ArrayList<String>();
        ArrayList<String> ArrayList2 = new ArrayList<String>();
        ArrayList<String> ArrayList3 = new ArrayList<String>();
        try
        {
            Scanner File1 = new Scanner(new File("/Users/Home/Desktop/File1.txt"));
            while (File1.hasNext())
            {
                ArrayList1.add(File1.next());
            }

            Scanner File2 = new Scanner(new File("/Users/Home/Desktop/File2.txt"));
            while (File2.hasNextLine())
            {
                ArrayList2.add(File2.next());
            }
        }
        catch (FileNotFoundException ex)
        {
            ex.printStackTrace();
        }
        for (String ArrayList : ArrayList1) 
        {
            System.out.println("File 1: " + ArrayList1);
        }
        for (String ArrayList : ArrayList2) 
        {
            System.out.println("File 2: " + ArrayList2);
        }

        if(ArrayList1.size()>ArrayList2.size())
        {
            for(int i=0; i<ArrayList1.size()-1; i++)
            {
                if(ArrayList1.get(i).equals(ArrayList2.get(i)))
                {
                    temp++;
                }
            }
        }
        if(ArrayList2.size()>ArrayList1.size())
        {
            for(int i=0; i<ArrayList2.size()-1; i++)
            {
                if(ArrayList2.get(i).equals(ArrayList1.get(i)))
                {
                    temp++;
                }
            }
        }
        if(temp == 0)
        System.out.println("The files are the same.");
        else
            System.out.println("There are " + temp + " differences between the files");

    }
}

4 个答案:

答案 0 :(得分:2)

这是问题所在:

    if(ArrayList1.size()>ArrayList2.size())
    {
    //ArrayList1 is bigger!!!!

        for(int i=0; i<ArrayList1.size()-1; i++)
        {
            if(ArrayList1.get(i).equals(ArrayList2.get(i)))
            // ArrayList2 does not contain as many elements as ArrayList1
            {
                temp++;
            }
        }
    }

因此。你可以从0开始循环 - > ArrayList.size()但是一定要使用较短的列表作为循环的限制! : - )

答案 1 :(得分:1)

或者,您可以替换:

for(int i=0; i<ArrayList1.size()-1; i++)

使用:

for (String s : ArrayList1)

这称为 for-each 循环,可用于更简单的迭代迭代。

答案 2 :(得分:0)

if(ArrayList1.size()>ArrayList2.size())
{
    for(int i=0; i<ArrayList1.size()-1; i++)
    {
        if(ArrayList1.get(i).equals(ArrayList2.get(i)))
        {
            temp++;
        }
    }
}

首先检查ArrayList1是否包含的项目多于ArrayList2,然后使用ArrayList1上的get(i)覆盖较大的ArrayList1ArrayList2

由于ArrayList1的商品数量超过ArrayList2,因此您最终get来自ArrayList1的索引为X的商品get来自ArrayList2 1}}因为ArrayList2包含较少的项目。

示例:ArrayList1有10个项目,ArrayList2有9个项目。你输入if因为10&gt; 9.然后在for循环的最后一次迭代中你做ArrayList1.get(9)这很好,因为它有10个项目,这得到了第10个,但ArrayList2.get(9)将失败,因为它只有9个项目。 8是您可以使用的最高指数。

第二个if有同样的问题,但反过来。

停止发生错误的修复方法是

for(int i = 0; i < ArrayList2.size(); i++)
{
    ...

这可能无法完成您希望代码执行的操作,但错误将会消失。

答案 3 :(得分:0)

正如Sara Seppola已经提到的,您需要使用两种尺寸的最小来比较两个列表中的元素。目前,您正在使用两者中最大的一个,保证您将在较小的列表中超出范围。

另外, 应该在你的循环限制中使用ArrayList1.size()而不是ArrayList1.size()-1,因为严格少于检查循环条件当前会导致i0迭代到ArrayList1.size()-2 - 这个太短了。同样,由-1引起的索引越界,而是由于条件中使用的大小不正确。

最后,您没有考虑列表大小相同的情况。目前,您的代码提供了&#34;文件是相同的&#34;因为在ArrayList1.size() == ArrayList2.size()时没有通过if-test。

if(ArrayList1.size() >= ArrayList2.size())
{
    // Here, ArrayList1.size() >= ArrayList2.size()
    // Use the smallest size as limit so we stay in bounds for both
    // In this case, that's ArrayList2.size()
    // When the lists have equal length, both sizes could be used
    // as limit so it doesn't really matter whether you use
    // > or >= in the test of the above if-statement
    for(int i=0; i<ArrayList2.size(); i++)
    {
        if(ArrayList1.get(i).equals(ArrayList2.get(i)))
        {
            temp++;
        }
    }
}
else
{
    // Here, ArrayList1.size() < ArrayList2.size()
    // so use ArrayList1.size() as the limit
    for(int i=0; i<ArrayList2.size(); i++)
    {
        if(ArrayList2.get(i).equals(ArrayList1.get(i)))
        {
            temp++;
        }
    }
}

您的代码中仍然存在错误:您只是在比较相应的元素。那些更大的列表中的额外元素呢?这些也应该算作差异。

快速解决方法是简单地减去两个大小以获得更大列表中的额外元素数量,并将其用作差异数量的初始值:

if(ArrayList1.size() >= ArrayList2.size())
{
    temp = ArrayList1.size() - ArrayList2.size();
    // [for loop]
}
else
{
    temp = ArrayList2.size() - ArrayList1.size();
    // [for loop]
}

当然,您仍然可以简化代码。您可以使用Math.min(ArrayList1.size(), ArrayList2.size())获取两个大小中最小的一个并删除重复的循环。您也可以使用Math.abs(ArrayList1.size() - ArrayList2.size())来获取额外元素的数量,无论ArrayList1还是ArrayList2是最大的。我将此作为练习留给读者。 ; - )