“线程中的异常”;“主要”;java.lang.ArrayIndexOutofBounds异常:6 公共类整数集{ int-dMax; 布尔[]集; 公共整数集(int domainMax){ dMax=domainMax+1; set=新布尔值[dMax]; } …一些方法。。。 公共静态整数集并集(整数集s1,整数集s2){ IntegerSet union=新的整数集(Math.max(s1.dMax,s2.dMax)); 对于(int i=0;i重写代码时要考虑的几个事项: 假设domainMax表示[0,domainMax]中的一组整数,请使用domainMax+1元素定义一个布尔数组(不必麻烦使用dMax变量,您可以通过检查set.length 在“union”函数中,确保处理一个或两个输入IntegerSets为空的情况 使用受保护集确保类外不知道或访问整数集的内部表示 当执行两个非空的整数集的并集时,仅对两个集合都有值的情况执行or操作(| |);然后,对于“较大”的集合,只需复制其余项即可 你认为这意味着什么?一旦你知道了这一点,你就可以反向工作来找出源代码。想象一下,s1.dMax是10,s2.dMax是20。因此,如果你迭代到Max(10,20),也就是20,那么s1.set会发生什么?插入对System.out.println的调用来打印出你的值,从异常点开始反向工作。(或者使用调试器。)啊,我明白了!现在说得通了!谢谢你让我明白了!可能是个愚蠢的问题,但是使用min是否会遗漏一些元素来创建联合?因为我认为产生的联合应该有这两个域中最大的一个。例如,“s1:{2 4}”s2:{4 5 6 7 9}只给我{2 4 5}@ USER334 639见我的编辑。我想这可能是你要找的。我可以看到你的代码在解释什么,但是我不认为你可以把这个操作符应用到布尔。@ USSR334 639正确。抱歉,我最近做了很多C++。0的应该是代码> false 。但是我不需要DimiNax + 1允许。对于0?因此,如果我制作一个数组[5],我将以{01 2 3 4}结束。不确定你的意思。int[]数组=新的int[5];用所有0初始化数组。因此它将是{0,0,0,0,0}。但您将有5个索引。传递到整数集构造函数的值是另一个整数集的大小,因此您不应缺少任何索引。 s1: {0 1 0 0 1 1} length = 6 s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12 union: {1 1 1 0 1 1} length = min(6, 12) = 6 s1: {0 1 0 0 1 1}! ! ! ! ! ! length = 6; no elements 7 through 12! s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12 union: {1 1 1 0 1 1 ! ! ! ! ! !} length = max(6, 12) = 12 -> errors IntegerSet union = new IntegerSet(Math.max(s1.dMax, s2.dMax)); for (int i = 0; i < (Math.max(s1.dMax, s2.dMax)); i++) { if (s2.set.length > s1.set.length) { union.set[i] = s2.set[i] || (i < s1.set.length ? s1.set[i] : false); } else { union.set[i] = s1.set[i] || (i < s2.set.length ? s2.set[i] : false); } } s1: {0 1 0 0 1 1} length = 6 s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12 union: {1 1 1 0 1 1 1 0 1 1 0 1} length = max(6, 12) = 12
谁能告诉我这有什么问题吗 我无法理解为什么在几个小时后收到错误消息:“线程中的异常”;“主要”;java.lang.ArrayIndexOutofBounds异常:6 公共类整数集{ int-dMax; 布尔[]集; 公共整数集(int domainMax){ dMax=domainMax+1; set=新布尔值[dMax]; } …一些方法。。。 公共静态整数集并集(整数集s1,整数集s2){ IntegerSet union=新的整数集(Math.max(s1.dMax,s2.dMax)); 对于(int i=0;i重写代码时要考虑的几个事项: 假设domainMax表示[0,domainMax]中的一组整数,请使用domainMax+1元素定义一个布尔数组(不必麻烦使用dMax变量,您可以通过检查set.length 在“union”函数中,确保处理一个或两个输入IntegerSets为空的情况 使用受保护集确保类外不知道或访问整数集的内部表示 当执行两个非空的整数集的并集时,仅对两个集合都有值的情况执行or操作(| |);然后,对于“较大”的集合,只需复制其余项即可 你认为这意味着什么?一旦你知道了这一点,你就可以反向工作来找出源代码。想象一下,s1.dMax是10,s2.dMax是20。因此,如果你迭代到Max(10,20),也就是20,那么s1.set会发生什么?插入对System.out.println的调用来打印出你的值,从异常点开始反向工作。(或者使用调试器。)啊,我明白了!现在说得通了!谢谢你让我明白了!可能是个愚蠢的问题,但是使用min是否会遗漏一些元素来创建联合?因为我认为产生的联合应该有这两个域中最大的一个。例如,“s1:{2 4}”s2:{4 5 6 7 9}只给我{2 4 5}@ USER334 639见我的编辑。我想这可能是你要找的。我可以看到你的代码在解释什么,但是我不认为你可以把这个操作符应用到布尔。@ USSR334 639正确。抱歉,我最近做了很多C++。0的应该是代码> false 。但是我不需要DimiNax + 1允许。对于0?因此,如果我制作一个数组[5],我将以{01 2 3 4}结束。不确定你的意思。int[]数组=新的int[5];用所有0初始化数组。因此它将是{0,0,0,0,0}。但您将有5个索引。传递到整数集构造函数的值是另一个整数集的大小,因此您不应缺少任何索引。 s1: {0 1 0 0 1 1} length = 6 s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12 union: {1 1 1 0 1 1} length = min(6, 12) = 6 s1: {0 1 0 0 1 1}! ! ! ! ! ! length = 6; no elements 7 through 12! s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12 union: {1 1 1 0 1 1 ! ! ! ! ! !} length = max(6, 12) = 12 -> errors IntegerSet union = new IntegerSet(Math.max(s1.dMax, s2.dMax)); for (int i = 0; i < (Math.max(s1.dMax, s2.dMax)); i++) { if (s2.set.length > s1.set.length) { union.set[i] = s2.set[i] || (i < s1.set.length ? s1.set[i] : false); } else { union.set[i] = s1.set[i] || (i < s2.set.length ? s2.set[i] : false); } } s1: {0 1 0 0 1 1} length = 6 s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12 union: {1 1 1 0 1 1 1 0 1 1 0 1} length = max(6, 12) = 12,java,Java,谁能告诉我这有什么问题吗 我无法理解为什么在几个小时后收到错误消息:线程“main”java.lang.ArrayIndexOutOfBoundsException中出现异常:6 由于作为参数提供的两个集合可能具有不同的域最大值;结果并集应该具有这两个域最大值中较大的一个,因此我使用Math.max 任何帮助都将不胜感激。此: public class IntegerSet { int dMax; boolean[] set; public IntegerSet(int domainMax)
线程“main”java.lang.ArrayIndexOutOfBoundsException中出现异常:6
由于作为参数提供的两个集合可能具有不同的域最大值;结果并集应该具有这两个域最大值中较大的一个,因此我使用Math.max
任何帮助都将不胜感激。此:
public class IntegerSet {
int dMax;
boolean[] set;
public IntegerSet(int domainMax) {
dMax = domainMax + 1;
set = new boolean[dMax];
}
...some methods...
public static IntegerSet union(IntegerSet s1, IntegerSet s2) {
IntegerSet union = new IntegerSet(Math.max(s1.dMax, s2.dMax));
for (int i = 0; i < (Math.max(s1.dMax, s2.dMax)); i++) {
union.set[i] = (s1.set[i] || s2.set[i]);
}
return union;
}
应该是:
dMax = domainMax + 1;
或者只需使用
set。for循环的长度从0
变为s1
和s2
的最大大小。但是因为(在抛出错误的情况下),其中一个整数集
s较小,从较大的整数集检索所有布尔值
s时,for循环超过较小的整数集
的大小
dMax = domainMax;
在for循环中,将从0迭代到4。发生以下情况时:
s1 = {0, 1, 1, 0, 1}
s2 = {0, 0, 0}
s1.dMax = 5, so s1.set has a size of 5
s2.dMax = 3, so s2.set has a size of 3
对于如何解决此问题,您有两个选项:
- 您可以在for循环中添加一个检查,以确保您没有被选中
要为您的小宝宝获取一个索引AutofBoundsException
IntegerSet
只需将union
中的索引设置为较大集合的boolean
值
- 您可以根据需要填充较小的
整数集
工会为空白指示符。<
- 如果要忽略该值,请使用两个
整数集的min
大小
额外的boolean
s(根据您创建并集的事实判断
最大尺寸,我想不是这样的)
旁注:当您创建联合整数集时,您也不需要将+1
添加到dMax
变量中。这将导致您有一个不需要的额外索引,并且可能会在以后导致问题。当s1
和s2
具有不同的l时,会出现问题长度。这些线条有缺陷:
i = 3
s1.set[i] = s1.set[3] //IndexOutOfBoundsException because the size of s1.set is 3.
您已经将循环编程为从0迭代到两个集合的最大长度,在上面的示例中是12(这意味着循环将使用的最后一个值是11)。但是s1
只有6个元素长——它的最后一个有效索引是5!因为循环错误地尝试访问元素7到12(索引6到11)对于s1
,它抛出一个ArrayIndexOutOfBoundsException。
要解决此问题,应在使用最大值的两行中使用两个集合的最小长度。这样,您将使用并集:
s1: {0 1 0 0 1 1} length = 6
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
而不是
s1: {0 1 0 0 1 1} length = 6
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
union: {1 1 1 0 1 1} length = min(6, 12) = 6
这使得s2
的后面部分脱离了联合,因为s1
中没有相应的元素来执行布尔值|
。但是,您也可以这样做:
s1: {0 1 0 0 1 1}! ! ! ! ! ! length = 6; no elements 7 through 12!
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
union: {1 1 1 0 1 1 ! ! ! ! ! !} length = max(6, 12) = 12 -> errors
由于anything | | false
本身就是一个集合,因此所有条目都只是从较长的集合中复制而来。您使用dMax
作为一个位置的布尔数组
元素数,并作为创建新的联合
集合时的域最大值(错误)。(这会使联合
1元素过大。)
< >重写代码时要考虑的几个事项:
假设domainMax
表示[0,domainMax]中的一组整数,请使用domainMax+1
元素定义一个布尔数组(不必麻烦使用dMax变量,您可以通过检查set.length
在“union
”函数中,确保处理一个或两个输入IntegerSet
s为空的情况
使用受保护集
确保类外不知道或访问整数集
的内部表示
当执行两个非空的整数集的并集时,仅对两个集合都有值的情况执行or操作(| |);然后,对于“较大”的集合,只需复制其余项即可
你认为这意味着什么?一旦你知道了这一点,你就可以反向工作来找出源代码。想象一下,s1.dMax是10,s2.dMax是20。因此,如果你迭代到Max(10,20),也就是20,那么s1.set会发生什么?插入对System.out.println的调用来打印出你的值,从异常点开始反向工作。(或者使用调试器。)啊,我明白了!现在说得通了!谢谢你让我明白了!可能是个愚蠢的问题,但是使用min是否会遗漏一些元素来创建联合?因为我认为产生的联合应该有这两个域中最大的一个。例如,“s1:{2 4}”s2:{4 5 6 7 9}只给我{2 4 5}@ USER334 639见我的编辑。我想这可能是你要找的。我可以看到你的代码在解释什么,但是我不认为你可以把这个操作符应用到布尔。@ USSR334 639正确。抱歉,我最近做了很多C++。0的应该是代码> false <代码>。但是我不需要DimiNax + 1允许。对于0?因此,如果我制作一个数组[5],我将以{01 2 3 4}结束。不确定你的意思。int[]数组=新的int[5];用所有0
初始化数组。因此它将是{0,0,0,0,0}。但您将有5个索引。传递到整数集
构造函数的值是另一个整数集
的大小,因此您不应缺少任何索引。
s1: {0 1 0 0 1 1} length = 6
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
union: {1 1 1 0 1 1} length = min(6, 12) = 6
s1: {0 1 0 0 1 1}! ! ! ! ! ! length = 6; no elements 7 through 12!
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
union: {1 1 1 0 1 1 ! ! ! ! ! !} length = max(6, 12) = 12 -> errors
IntegerSet union = new IntegerSet(Math.max(s1.dMax, s2.dMax));
for (int i = 0; i < (Math.max(s1.dMax, s2.dMax)); i++) {
if (s2.set.length > s1.set.length)
{
union.set[i] = s2.set[i] || (i < s1.set.length ? s1.set[i] : false);
}
else
{
union.set[i] = s1.set[i] || (i < s2.set.length ? s2.set[i] : false);
}
}
s1: {0 1 0 0 1 1} length = 6
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
union: {1 1 1 0 1 1 1 0 1 1 0 1} length = max(6, 12) = 12