【问题标题】:ArrayofInts(Java)整数数组(Java)
【发布时间】:2012-11-05 10:29:44
【问题描述】:

我已经编程了很长时间,但是我遇到了一个问题。我要做的是实现一个与内置数据类型 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);

}

}

【问题讨论】:

  • 您可以通过创建一个整数数组列表来使用提供给您的所有方法,如下面的 ADAM 所回答。
  • 如果您真的想要重新发明轮子,为什么不使用int[] 作为属性来支持您的数据。但我希望这是用于培训而不是生产。 编辑 (看起来像家庭作业,那么你尝试了什么?)。

标签: java arrays integer


【解决方案1】:

如果您被允许使用另一个 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&lt;Integer&gt; 而不是Iterator&lt;int&gt;,因为int 不是引用类型,而是原始类型。这将在程序运行时强制进行一些自动装箱和拆箱。因此,在 ArrayOfInt 类上的 for-each 循环不会像在 int[] 上那样有效。

但是,如果不允许您使用 int[] 作为 int 的底层数组,那么您需要以完全不同的方式对类 ArrayOfInt 进行编码。首先,您必须确定您的ArrayOfInt 将是哪种数据结构。(我更喜欢平衡的二叉搜索树,其节点在构造过程中仅按键排列一次,其中每个节点的键是它的索引。并且在在这种情况下,ArrayOfInt 类的 iterator() 方法将返回树的有序遍历。)然后您必须为该数据结构编写至少 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[]float[][]String[]AnyClass[]SomeClass[][])都是 class Object 的子类。因此,当您的类ArrayOfIntegers 创建一个新对象时,名为arr 的对象(在名为d 的对象内部)被自动初始化为null。 因此,试图访问 arrnull)的语句 arr[index]=value; 引发了 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);
}

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

【讨论】:

  • 我可以使用 int[]。我发布了我更新的代码。我收到 nullpointerexception 错误,我不知道为什么。
【解决方案2】:

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

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

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

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

【讨论】:

  • 问题是这是家庭作业,他们希望我这样做。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2019-01-11
    • 1970-01-01
    • 2016-07-10
    • 2012-11-24
    相关资源
    最近更新 更多