Java 如何修复此异常
下面是我用来区分两个txt文件之间差异的代码。唯一的问题是,如果我不从arrayList中减去1,我会得到一个越界异常,所以现在它并不是对所有元素都运行,我该如何解决这个问题Java 如何修复此异常,java,arraylist,java.util.scanner,indexoutofboundsexception,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
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");
}
}
import java.io.*;
导入java.util.*;
公共类myfilereader
{
公共静态void main(字符串[]args)引发java.io.IOException
{
内部温度=0;
ArrayList ArrayList 1=新的ArrayList();
ArrayList ArrayList 2=新的ArrayList();
ArrayList ArrayList 3=新的ArrayList();
尝试
{
Scanner File1=新扫描仪(新文件(“/Users/Home/Desktop/File1.txt”);
while(File1.hasNext())
{
add(File1.next());
}
Scanner File2=新扫描仪(新文件(“/Users/Home/Desktop/File2.txt”);
while(File2.hasNextLine())
{
ArrayList2.add(File2.next());
}
}
捕获(FileNotFoundException ex)
{
例如printStackTrace();
}
for(字符串ArrayList:ArrayList 1)
{
System.out.println(“文件1:+ArrayList1”);
}
for(字符串ArrayList:ArrayList 2)
{
System.out.println(“文件2:+ArrayList2”);
}
if(ArrayList1.size()>ArrayList2.size())
{
对于(int i=0;iArrayList1.size())
{
对于(int i=0;i这就是问题所在:
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++;
}
}
}
if(ArrayList1.size()>ArrayList2.size())
{
//ArrayList 1更大!!!!
对于(int i=0;i ArrayList.size(),但请确保使用较短的列表作为循环的限制!:-)或者,您可以替换:
for(int i=0; i<ArrayList1.size()-1; i++)
这称为for-each循环,可用于更可读的更简单的迭代
if(ArrayList1.size()>ArrayList2.size())
{
for(int i=0; i<ArrayList1.size()-1; i++)
{
if(ArrayList1.get(i).equals(ArrayList2.get(i)))
{
temp++;
}
}
}
这可能不符合您的代码要求,但错误将消失。正如Sara Seppola已经提到的,您需要使用两个大小中最小的一个来比较两个列表中的元素。目前,您使用的是两个列表中最大的一个,这保证了您将超出较小列表的范围
此外,您应该在循环限制中使用ArrayList1.size()
而不是ArrayList1.size()-1
,因为严格小于签入循环条件当前导致i
从0
迭代到ArrayList1.size()-2
-这是一个太短的索引。同样,索引超出边界不是由-1
引起的,而是因为在条件中使用了不正确的大小
最后,您没有考虑列表大小相等的情况。目前,您的代码给出“文件相同”,因为当ArrayList1.size()==ArrayList2.size()
时,没有通过if测试
当然,您仍然可以简化代码。您可以使用Math.min(ArrayList1.size(),ArrayList2.size())
获取两个大小中的最小值并删除重复的循环。您还可以使用Math.abs(ArrayList1.size()-ArrayList2.size())
获取额外元素的数量,无论ArrayList1
还是ArrayList2
是最大的。我将把这作为读者的练习。;-首先在代码中检查ArrayList2.size()>ArrayList1.size(),然后在0到ArrayList2.size()之间操作for循环因为ArrayList2更大,所以在点i中找不到ArrayList1中的最后一个元素!我认为for循环应该从0到ArrayList1.size()既然一个比另一个短,如果一个列表比另一个列表大,你怎么能期望用相同的索引在这两个列表中循环?还有,为什么不在完成读取后关闭文件?@antoh这不是问题。for条件是i
,因此它会在i==ArrayList1.size()之后立即停止-2
因为严格小于。正确的条件是i
。实际问题是OP使用了错误的限制:他应该使用两种尺寸中最小的一种。此外,他可能应该在他的if测试中使用大于或等于。在这种情况下,您如何比较两个列表中的匹配元素?您需要对每个元素进行比较,因此需要使用i
为两个列表编制索引。为True,但-1
仍然错误。使用Arraylist 2.size()-1
不会检查Arraylist 2
中的最后一个元素。这是真的:)如果要遍历整个数组,则需要从0->Arraylist.size()就像我在代码之后已经提到的,非常感谢大家!!!我能够理解所有内容并以正确的方式编写代码
if(ArrayList1.size()>ArrayList2.size())
{
for(int i=0; i<ArrayList1.size()-1; i++)
{
if(ArrayList1.get(i).equals(ArrayList2.get(i)))
{
temp++;
}
}
}
for(int i = 0; i < ArrayList2.size(); i++)
{
...
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]
}