“线程中的异常”;“主要”;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