Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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_Collections - Fatal编程技术网

Java 如何编写自己的数组和列表

Java 如何编写自己的数组和列表,java,arrays,collections,Java,Arrays,Collections,我必须编程几种不同类型的二叉树。但是,我不允许使用诸如数组或集合之类的UTIL。如果需要,建议构建我自己的阵列。问题是,我甚至不知道从哪里开始。比如说,我如何构建一个二维数组?带有链接列表。代码如下:您必须通过创建对象手动创建链接列表或树,每个对象都包含指向列表或树中下一个对象的指针。这是我上学时在数据结构课上做过很多次的练习。了解如何通过插入和删除保持列表或树的完整性是一个有用的练习 public class ListNode<T> { private T payload;

我必须编程几种不同类型的二叉树。但是,我不允许使用诸如数组或集合之类的UTIL。如果需要,建议构建我自己的阵列。问题是,我甚至不知道从哪里开始。比如说,我如何构建一个二维数组?

带有链接列表。代码如下:

您必须通过创建对象手动创建链接列表或树,每个对象都包含指向列表或树中下一个对象的指针。这是我上学时在数据结构课上做过很多次的练习。了解如何通过插入和删除保持列表或树的完整性是一个有用的练习

public class ListNode<T> { private T payload; private ListNode<T> nextNode; } public class TreeNode<T> { private T payload; private TreeNode<T> leftChild, rightChild; } 公共类列表节点{ 私人T载荷; 私有列表节点nextNode; } 公共级树节点{ 私人T载荷; private TreeNode leftChild,rightChild; }
编辑:好的,每个人都提到了列表,但不要忘记,您也可以在数组上实现二叉树,就像实现了堆一样。所以我们有一些类似于:

public class BinaryTree {
    private int[] tree; // assuming each node holds an integer.
    private int nodeCount;

    public BinaryTree (int nodes) {
         tree = new int[nodes * 2];
         nodeCount = nodes;
    }

    public int getRoot() {
         return tree[0];
    }

    private int getPositionOfNode(int value) {
         for(int i = 0; i < nodeCount; i++) {
             if(tree[i] == value) {
                 return i;
             }
         }
         return -1;
    }

    public int getLeftChildOfNode(int node) {
         int pos = getPositionOfNode(node);
         if(pos != -1) {
              return tree[pos * 2];
         }
         return pos;
    }

    public int getRightChildOfNode(int node) {
         int pos = getPositionOfNode(node);
         if(pos != -1) {
              return tree[pos * 2 + 1];
         }
         return pos;
    }

    public int getParentOfNode(int node) {
         int pos = getPositionOfNode(node);
         if(pos != -1) {
              return tree[pos / 2];
         }
         return pos;
    }
}
公共类二进制树{
private int[]tree;//假设每个节点都有一个整数。
私有int节点计数;
公共二进制树(int节点){
tree=newint[nodes*2];
nodeCount=节点;
}
public int getRoot(){
返回树[0];
}
私有int getPositionOfNode(int值){
for(int i=0;i

在此结构中,如果节点位于位置i,则其子节点将位于位置2*i和2*i+1。

构建树时不需要数组。如果您在维基百科上找不到所需内容,那么有几本关于算法和数据结构的书:

(问题的答案:对于2d数组,创建1d数组,并将1d数组存储在1d数组中。可以通过创建自己的链表实现来模拟内置数组。但这既不有效,也不是老师想要的。)

(实际问题的灵感,你不知道你是 询问:

这是二进制搜索的核心数据结构 树

class Node {
     Object value;
     Node left;
     Node right;
} )
像这样的?
应该没那么难。

我先假设您甚至被禁止使用Java的基本数组类型。在这种情况下,您必须回到最基本的方面,自己开始管理内存。您需要从分配一个适当大小的字节数组或字节缓冲区开始。访问该da块然后将使用C中简单的指针数学来处理ta

16整数的一维数组示例:

byte[] mem = new byte[16 * 4] ; // Ints are 4 bytes long

// Write a value to the 8th element of our "array"
index = 8 ;
int value = 31415926 ;
mem[4 * index + 0] = (byte)( value >> 24 ) ;
mem[4 * index + 1] = (byte)( ( value << 8 ) >> 24 ) ;
mem[4 * index + 2] = (byte)( ( value << 16 ) >> 24 ) ;
mem[4 * index + 3] = (byte)( ( value << 24 ) >> 24 ) ;
byte[]mem=新字节[16*4];//整数为4字节长
//向“数组”的第8个元素写入一个值
指数=8;
整数值=31415926;
mem[4*索引+0]=(字节)(值>>24);
mem[4*索引+1]=(字节)((值>24);
mem[4*索引+2]=(字节)((值>24);
mem[4*索引+3]=(字节)((值>24);
读取一个值将通过反转过程并计算存储的int值来完成


注意:使用ByteBuffer设置和检索值的过程更容易,因为它是获取基本Java类型并将其放入字节数组的方法。

您自己的数组…什么意思?在Java中重新编程连续内存分配?:)如果你不知道从哪里开始,在重读你的课堂讲稿和课本之后,你可能应该和你的教授谈谈,以便更好地理解作业。如果你能想出一些开始的方法,更新你的问题,你可能会得到帮助。+1.这是一个寻求帮助的学生。我认为这是一个有效的问题。我为@vedran没有找人替他做作业而鼓掌。
家庭作业+1
标签:)@当然是DJClayworth,但这在任何语言中都是一个有用的练习,绝对适合本科生的工作。不,我们不能,我们也不能使用LinkedList注意,我不是建议你使用
LinkedList
类,而是实现你自己的链接列表。@vedran特别询问了如何构建2D列表,它基本上只是一个列表列表。我更新了我的答案以合并树或列表。概念基本相同。这对我来说有点太复杂了,但如果我没有找到更好的解决方案,我会尝试一下。你能不能使用primitive(经典)数组?您在对我的回答的评论中提到您不能使用它们,但您似乎在这里指出您可以。
byte[] mem = new byte[16 * 4] ; // Ints are 4 bytes long

// Write a value to the 8th element of our "array"
index = 8 ;
int value = 31415926 ;
mem[4 * index + 0] = (byte)( value >> 24 ) ;
mem[4 * index + 1] = (byte)( ( value << 8 ) >> 24 ) ;
mem[4 * index + 2] = (byte)( ( value << 16 ) >> 24 ) ;
mem[4 * index + 3] = (byte)( ( value << 24 ) >> 24 ) ;