Java 中字符串数组的复制构造函数

Copy Constructor for a String Array in Java

提问人:Frances Brown 提问时间:10/1/2019 最后编辑:Frances Brown 更新时间:10/1/2019 访问量:2874

问:

因此,我目前正在从事一个项目,该项目正在为数组字符串列表和链接字符串列表重新创建方法。有一个 StringList 接口,ArrayStringList 和 LinkedStringList 都实现了该接口。我们不允许看到接口的源代码 - 只能看到 API 文档。对于每个类,我们必须为两个类创建一个默认构造函数和复制构造函数。我已经运行了测试,默认构造函数都通过了,但 ArrayStringList 复制构造函数不起作用,并且一直在抛出“null”或“-1”的错误消息。我对继承和接口很陌生,我认为对象参数与字符串数组数据类型让我有点失望。

这是我目前拥有的代码,以及构造函数中使用的方法:

My Copy 构造函数:

private String[] stringArray;
private int size;

public ArrayStringList(StringList sl) {
    size = sl.size();
    ArrayStringList asl = new ArrayStringList();
    for(int i = 0; i < size-1; i++) {
        if(sl.get(i) != null) {
            asl.set(i,sl.get(i).toString());
        } //if
    } // for
} // copy constructor

尺寸方法:

public int size() {
    return stringArray.length;
} // size

Get 方法:

public String get(int index) {
    if(index < 0 || index >= size) {
        throw new IndexOutOfBoundsException("out of bounds");
} else {
        return stringArray[index];
    }
} //get

设置方法:

public String set(int index, String s) {
    String old = stringArray[index];
stringArray[index] = s;
    return old;
} // set

在项目中,复制构造函数的描述如下:

实现类必须显式定义复制构造函数。复制构造函数应只采用接口类型 StringList 的一个参数。它应该使新构造的列表对象成为构造函数参数引用的列表的深层副本。因此,新列表对象的初始大小和字符串元素将与其他列表相同。需要明确的是,另一个列表可以是 StringList 接口的任何实现的对象。不应对对象的类型做出其他假设。

Java Arrays 构造函数 interface copy-constructor

评论

0赞 SSP 10/1/2019
if(sl.get(i) != null) 为什么在这里检查 null?
0赞 SSP 10/1/2019
SET 方法的后文档
0赞 SSP 10/1/2019
你能定义 ArrayStringList<String> asl = new ArrayStringList<>();喜欢这个?
0赞 Rostyslav Barmakov 10/1/2019
请提供您正在尝试实现的Interface
0赞 Frances Brown 10/1/2019
@SSP - 我已经添加了集合。我只是尝试添加它以尝试摆脱空错误并查看它到底发生在哪里。

答:

1赞 Joakim Danielson 10/1/2019 #1

我会将内部数组初始化为 的值,并利用该类也有一个复制构造函数的事实sizeString

public ArrayStringList(StringList sl) {
    this.size = sl.size();
    this.stringArray = new String[size];
    for(int j = 0; j < size; j++) {
        this.stringArray[j] = new String(sl.get(i));
    } 
}

评论

0赞 Frances Brown 10/1/2019
这太有帮助了,谢谢!它似乎没有在最后一行编译,使用 String(sl.get(i));并说它找不到该符号。我会改用 StringList 吗?
0赞 Frances Brown 10/1/2019
当我一起取出字符串时,它确实会编译。那还能一样吗?当我在没有 String 的情况下运行测试时,它仍然会抛出 -1 错误。
0赞 Izruo 10/1/2019
@FrancesBrown 该错误可能与您的迭代有关,迭代在 - 停止,以防您没有从此答案中复制代码。-1i < size-1
2赞 chrylis -cautiouslyoptimistic- 10/1/2019
您的 Java 无效。此外,Java 中的 String 类是不可变的,不需要复制。String(sl.get(i))
0赞 Joakim Danielson 10/1/2019
@FrancesBrown对不起,我错过了关键字new
1赞 SSP 10/1/2019 #2
public void ArrayStringList(StringList sl) {
    size = sl.size();
    ArrayStringList asl = new ArrayStringList();
    for(int i = 0; i < size; i++) {
        if(sl.get(i) != null) {
            String s  = asl.set(i,sl.get(i).toString());
            System.out.println(s);
        } //if
    } // for
}

更改设置方法,如下所示。并借助类对象来调用它。它将在全局静态列表中设置值。

//Change set method like this
public String set(int index, String s) {

    stringArray[index] = s;
    return stringArray[index];
}
2赞 Rostyslav Barmakov 10/1/2019 #3
public class ArrayStringList implements StringList {

  private static final int INITIAL_CAPACITY = 10;

  private String[] stringArray;
  private int size;

  public ArrayStringList(StringList sl) {
    stringArray = sl.toArray();
    size = stringArray.length;
  }


  public ArrayStringList() {
    stringArray = new String[INITIAL_CAPACITY];
    size = 0;
  }

  // TODO: Extract 'if-cascade' to an validate(..) method 
  @Override
  public String set(int index, String s) {
    if (index >= size) {
      throw new IndexOutOfBoundsException("")
    } else if (s == null) {
      throw new NullPointerException("the specified string is null");
    } else if (s.isEmpty()) {
      throw new IllegalArgumentException("specified string is empty");
    }
    String old = stringArray[index];
    stringArray[index] = s;
    return old;
  }

  // TODO: Check if posible to extend the stringArray
  @Override
  public boolean add(String s) {
    if (s == null) {
      throw new NullPointerException("the specified string is null");
    } else if (s.isEmpty()) {
      throw new IllegalArgumentException("specified string is empty");
    }

    if (size == stringArray.length) {
      int newListCapacity = stringArray.length * 2;
      stringArray = Arrays.copyOf(stringArray, newListCapacity);
    }
    stringArray[++size] = s;
    return true;
  }

  // TODO: implement other methods ...
}

请记住,此实现仍然有问题,但您可以将其用作起点

评论

1赞 Rostyslav Barmakov 10/1/2019
不客气!PS:我刚刚更新了默认构造函数和方法add(..)