Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制构造函数帮助,尝试复制布尔数组。JAVA_Java_Arrays_Copy Constructor - Fatal编程技术网

复制构造函数帮助,尝试复制布尔数组。JAVA

复制构造函数帮助,尝试复制布尔数组。JAVA,java,arrays,copy-constructor,Java,Arrays,Copy Constructor,我已经尽可能多地浏览了前面的问题,但从来没有见过一个以布尔数组作为变量的问题 这是我的班级: public class Register { private boolean[] register; private int length; //Normal constructor public Register(int n) { if (n == 8 || n == 16 || n == 32 || n == 64) { length = n;

我已经尽可能多地浏览了前面的问题,但从来没有见过一个以布尔数组作为变量的问题

这是我的班级:

public class Register {

private boolean[] register;
private int length;

    //Normal constructor
public Register(int n) {

    if (n == 8 || n == 16 || n == 32 || n == 64) {

        length = n;
        register = new boolean[length];

        for (int i = 0; i < length; i++) {

            register[i] = false;
        }

    } else {

        throw new RegisterException(
                "A register can only contain 8, 16, 32, or 64 bits");
    }

}

// Creates a copy of reg (an existing Register)
public Register(Register reg) {

    length = reg.length;
    register = new boolean[reg.register.length];

    System.arraycopy(reg.register, 0, this.register, 0, reg.register.length);
}
公共类寄存器{
专用布尔[]寄存器;
私有整数长度;
//正规构造器
公共登记册(int n){
如果(n==8 | | n==16 | | n==32 | | n==64){
长度=n;
寄存器=新布尔值[长度];
for(int i=0;i
在我的驱动程序中,我正在将“1101101”加载到寄存器1中,但当我加载时: 寄存器寄存器2=新寄存器(寄存器1)

并打印出我得到的两个结果:

000000000 1101101

0000000000010110

我不太清楚发生了什么事。如果有任何帮助,我们将不胜感激,谢谢

这是我的加载方法。我推迟将其放在这里,因为它可能很难阅读:

public void load(String binaryRep) {

    String allTheBits = binaryRep;
    int charPosition = 0;
    int loadLength;
    int binaryNum = 0;
    String index = "";
    String trimmedIndex = "";

    if (allTheBits.length() > 0 && allTheBits.length() <= length) {

        loadLength = allTheBits.length();

        for (int i = length - (loadLength); i < length; i++) {

            index = allTheBits.charAt(charPosition) + "";
            trimmedIndex = index.trim();
            binaryNum = Integer.parseInt(trimmedIndex);

            if (binaryNum == 1) {

                register[i] = true;

            } else if (binaryNum == 0) {

                register[i] = false;
            }

            charPosition++;

        }
    } else {
        throw new RegisterException("You can only load 0 - " + length
                + "bits.");
    }
}
公共无效加载(字符串binaryRep){
字符串allTheBits=binaryRep;
int charPosition=0;
int加载长度;
int binaryNum=0;
字符串索引=”;
字符串trimmedIndex=“”;

如果(allTheBits.length()>0&&allTheBits.length(),这里有一种更惯用的方法(使用可克隆接口):

还有一个JUnit测试,显示了它的作用:

import org.junit.Assert;
import org.junit.Test;


public class RegisterTest {

    @Test
    public void testRegisterToString() {

        Register source = new Register( new boolean[] {true, true, false, false, true, false, true, false } );

        String result = "11001010";

        Assert.assertEquals( result, source.toString() );

    }

    @Test
    public void testRegisterCloning() {

        Register source = new Register( new boolean[] {true, true, false, false, true, false, false, false } );
        Register clone = source.clone();

        Assert.assertEquals( source.toString(), clone.toString() );

    }

}

我刚刚用以下内容验证了加载方法:

public static void main(String [] args)
{
    Register r1 = new Register(8);
    r1.load("1101101");
    Register r2 = new Register(r1);
    for (int i=0; i<8; i++) System.out.println(r2.register[i]);
}

就Register对象的内容而言,我认为这是正确的,因此问题可能在于访问。

几句话,让您了解一些基本知识

  • 正如@Ted所说,不需要将长度字段保留为寄存器。长度将为您提供相同的结果
  • 局部变量不是用默认值初始化的,但是数组是用默认值初始化的,因为它们存储在堆中
  • 使用布尔数组来实现这一点可能感觉很简单,但其内存效率极低,因为每个布尔值在堆中至少占用32位。因此,要表示64位寄存器,您使用的是至少32*64+32=2080位…使用字节数组和位逻辑会有点困难,但嘿,这是一个小挑战:)

  • 无论如何,您的代码看起来不错(顺便说一句,使用Arrays.copyOf方法,因为它更具可读性),因此错误应该来自另一个方面。

    您可以向我们展示您的打印代码吗?顺便说一句,您不需要在默认构造函数中将
    register
    的元素显式初始化为
    false
    ;这是新数组分配的默认值。另外,因为
    this.register.length==this.length
    f或者每个寄存器对象,你实际上不需要
    长度
    字段。8位,但你只有7位数字?有什么遗漏吗?@Tim:你没有将代码粘贴到你“加载”寄存器的“1101101”位置。我很确定你的“加载”中有一些相反的逻辑方法。@蒂姆:顺便说一句,目前您使用自己的RegisterException的原因可能不多(看到您提出的基本问题了,我不建议您在此时创建自己的异常……稍后您可能会认为自定义异常在许多根本不存在的语言中并不那么有用,即使在Java中,您也可以不使用它们).IllegalArgumentException可能是你想要的。我发布了我的加载方法。感谢其他提示,伙计们,谢谢。因为我发布了我的加载方法,所以我发布了实际输出。我们应该从后面开始加载它们。我想读另一种方法会更容易。很好的代码。它只需要复制构造函数这就是OP的原始帖子的主题:)我需要使用构造函数,尽管>>谢谢你的回答,尽管它确实帮助我更好地理解我自己的程序。当语言本身定义了一个可克隆的接口并要求人们在“克隆”时实现它时,使用副本构造函数是一个糟糕的设计模式是必要的:)@Tim:我已经用了当天的最后一票,并且对原来的问题投了赞成票。Tim,你现在有足够的代表投票到你每天的最高点,恭喜!:)@Maurício Linhares如果Java中的克隆接口没有被完全破坏的话,那是真的(甚至连它自己的开发者/设计师都说他们不使用它)。因此,拥有一个复制构造函数并不是一个糟糕的设计-许多正式类都有一个(而几乎没有任何类实现clonable)。仍然+1,因为它显示了良好的代码并且可以轻松转换:)是的,Ted,你说得对,一个位集就可以了。我忘记了那个类。所以@Tim,你甚至不必重做轮子:)
    public static void main(String [] args)
    {
        Register r1 = new Register(8);
        r1.load("1101101");
        Register r2 = new Register(r1);
        for (int i=0; i<8; i++) System.out.println(r2.register[i]);
    }
    
    > run Register
    false
    true
    true
    false
    true
    true
    false
    true
    >