3

我已经编程了很长时间,但是我遇到了一个问题。我要做的是实现一个与内置数据类型 int[] 具有相同功能的类。

为我提供了以下方法:

public ArrayOfInt(int size); 
public int length(); 
public int get(int index); 
public void put(int index, int value);

主要方法是测试代码。

我几乎不知道从哪里开始。有人可以帮助我吗?

编辑:这是我更新的代码。当我尝试使用 d.put(0,1) 时,我得到一个 nullpointerexception 错误,这就是我现在感到困惑的地方。d.put(0,1) 不应该定义索引和值整数吗?

public class ArrayofIntegers

{

private int[] arr;


public  int ArrayOfInt(int size)

{

     arr = new int[size];

    return size;

}

public int length()
{

    return arr.length;

}

public int get(int index)

{

    return arr[index];

}

public void put(int index, int value)

{

    arr[index]=value;
    System.out.print(arr[index]=value);

}

public static void main(String[] args)

{
    ArrayofIntegers d = new ArrayofIntegers();
    d.put(0,1);

}

}

4

3 回答 3

6

我认为你不应该重新发明轮子,因为 java 有一些内置的可修改替代数组,比如List. List是通用的,所以你可以像这样创建一个Listof Integers:

List<Integer> intList = new ArrayList<Integer>(); // can be ArrayList<> in java 1.7

并享受List界面带来的好处。如果内置实现(如LinkedListArrayList)对您来说不够好,那么您可以随时扩展AbstractListJava Collections Framework 中提供的实现。

如果您需要更多帮助,请查看官方文档:Java List

于 2012-11-05T10:31:04.900 回答
2

它已经在内置库中可用 -java.util.ArrayList这是一个 List 实现。
请查找文档

于 2012-11-05T10:32:36.853 回答
2

如果您被允许使用另一个 int 数组作为后备数组,那么这段代码对您来说应该足够了:

public class ArrayOfInt{
    private final int[] array;

    public ArrayOfInt(int size) {
        array=new int[size];
    }

    public int length() {
        return array.length;
    }

    public int get(int index) {
        return array[index];
    }

    public void put(int index, int value) {
        array[index]=value;
    }

}

int[]但是它会缺少一种内置数据类型的功能。那是int[]可迭代的,因此for-each循环可以应用于int[],但不能高于类。因此,要使其可迭代,您必须将上面的代码更改为:

import java.util.Iterator;

public class ArrayOfInt implements Iterable<Integer>{
    private final int[] array;

    public ArrayOfInt(int size) {
        array=new int[size];
    }

    public int length() {
        return array.length;
    }

    public int get(int index) {
        return array[index];
    }

    public void put(int index, int value) {
        array[index]=value;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator() {
            private int current_index;

            @Override
            public boolean hasNext() {
                return current_index<array.length;
            }

            @Override
            public Integer next() {
                return array[current_index++];
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException("Cannot Resize Underlying Array");
            }
        };
    }
}

正如您在上面看到的,我们使用Iterator<Integer>Iterator<int>asint不是引用类型,而是原始类型。这将在程序运行时强制进行一些自动装箱和拆箱。因此for-each,类上的循环ArrayOfInt不会像结束时那样有效int[]

但是,如果不允许您将其int[]用作 int 的底层数组,那么您就必须ArrayOfInt以完全不同的方式对类进行编码。首先,您必须决定您将使用哪种数据结构ArrayOfInt。(我更喜欢平衡二叉搜索树,其节点在构建过程中仅按一次键排列,其中每个节点的键是它的索引。在这种情况下iterator()该类的方法ArrayOfInt将返回树的有序遍历。)然后您必须为该数据结构编写至少 2 个类: (1)ArrayOfInt和 (2) NodeOfInt。这些节点对象如何通过索引链接和搜索,取决于您选择的数据结构。祝一切顺利。


[这部分答案是在提问者添加更多信息后添加的]

更改这段代码:

public  int ArrayOfInt(int size)

{

     arr = new int[size];

    return size;

}

对此:

public ArrayOfIntegers(int size)
{
    arr = new int[size];
}

并更改这行代码:

ArrayofIntegers d = new ArrayofIntegers();

到这一行:

ArrayofIntegers d = new ArrayofIntegers(10); // Now your array size is fixed at 10
// For an array of size 15 , use statement: ArrayofIntegers d = new ArrayofIntegers(15);

你得到一个 NullPointerException 因为;在 Java 中,每个数组(无论是int[]or float[][]or String[]or AnyClass[]or SomeClass[][])都是class Object. 因此,当您的类ArrayOfIntegers创建了一个新对象时,一个名为arr(在名为的对象内d)的对象会自动初始化为null. arr[index]=value;因此,试图访问arr(a )的语句null引发了 NullPointerException。

[以下几行与您的 nullpointerexception 无关,但我仍在添加它们以获得有效的代码]

你的功能public void put(int index, int value)应该是这样的:

public void put(int index, int value)
{
    arr[index]=value;
    System.out.print(arr[index]);
}

或这个:

public void put(int index, int value)
{
    System.out.print(arr[index]=value);
}

但不是这个:

public void put(int index, int value)
{
    arr[index]=value;
    System.out.print(arr[index]=value);
}

它在代码中创建冗余(重复语句)。

于 2012-11-05T11:59:45.960 回答