繁体   English   中英

简单的Java清单问题

[英]Simple Java List Question

我应该创建一个迭代方法拉伸,将正数n作为参数,并返回一个新的ListItem,开始一个列表,其中原始列表中的每个数字都重复n次。 例如,如果原始列表为(6 7 6 9)并且参数值为2,则返回的新列表为(6 6 7 7 6 6 9 9)。

我已经有一个listitem构造函数,该构造函数具有该节点的值和对下一个节点的引用:

   ListItem(int number, ListItem next) {
        this.number = number;
        this.next   = next;
}

我的代码如下所示:

    public ListItem stretch(int n) {
        //make an array of list items that is n times bigger than the original one.
        ListItem[] newList = new ListItem[this.length() * n];

    //Then loop through the old list one value at a time. At each value do a second loop n times to stretch

        int index = 0;
        int counter = 0;
        for(int i = 0; i < this.length(); i++){
            while(counter++ < n){
                newList[index++] = this[i];*************************
        }
        return newList;****************
    }

}

有两个问题要点,在这些问题上我加了注视。 我应该返回一个listitem,但是NewList是一个数组。 我不确定第一条加星标的行有什么问题。

任何帮助/指导将不胜感激。

解决此问题的最佳方法是绘制一些图片。 然后尝试将问题分解为多个子问题。 让我们从一个简单的案例开始:一个长度为2的列表:

ListItem two = new ListItem(1, ListItem(2, null));

这是一张照片

two = ( number == 1
      ( next   == ( number == 2
                  ( next   == null

这是另一张图片:

+---+  +---+    The "/" here is the "null" above, which terminates the list.
| 1 |->| 2 |-/  
+---+  +---+

这样想:一个列表由第一个ListItem组成,它通过“ next”指向列表的其余部分。 空列表则为null,最后一个ListItem的“ next”始终为空。 (空值)。

现在,当我们被要求“拉伸”列表时,实际上发生了什么? 说2点?

好了,空列表很容易,它不会改变。 但这也无关紧要,因为null.stretch()会以您使用的语言结尾很差。 那么长度1的列表就是我们最简单的实际情况:

我们有:

we have       we want

+---+         +---+   +---+
| 1 |-/       | 1 |-->| 1 |-/
+----         +---+   +---+

好吧,这并不难。 我们已经有一个长度为1的列表。 我们需要做的就是将它挂在新ListItem的下一个,我们将得到一个长度为2的列表。 显然,我们需要能够向现有列表添加内容的功能。 将其添加到最容易的位置,因此我们将为此定义一个小帮手:

ListItem addItemToFront(int number) {
    return new ListItem(number, this);
} 

好的,现在让我们对其进行编码,并将其称为stretchFirstItemByOne:

ListItem stretchFirstItemByOne() {           
    return this.addItemToFront(this.number); 
}

在这些示例中,您会看到我经常使用this.something(),尽管这不是必需的。 我只是想弄清楚这些是当前对象(此)上的方法调用。

但是,假设我们要延伸更大的n 您已经尝试过-有点不幸-在上面使用了for循环。 你可以那样做。 但是我将以不同的方式来做。

ListItem stretchFirstItem(n) {
    if (n == 1)      // stretching to length 1 means nothing
        return this; // to do. just return this.
    else {
        // well, if we stretch our item to length n-1 first
        // then all we have to do is stretch it by one and
        // we're done.
        return this.stretchFirstItem(n-1).stretchFirstItemByOne(); 
    }
}

停下来想一想。 如果遇到问题,请将其重写为for循环。

您可能会说,这非常好,但是它只能处理长度为1的列表。 多么真实,多么真实。

假设您有一个长度为3的列表,并且想将其扩展为2。

+---+  +---+  +---+
( | 1 |->| 2 |->| 3 |-/ ).stretch(2)
  +---+  +---+  +---+

强硬? 好吧,至少我们可以开始。 如果列表只有一项,我们知道如何处理:

ListItem stretch(int n) {
    ListItem restOfList = this.next;
    if (restOfList == null) { // this list has length one
        return this.stretchFirstItem(n);
    } else {
        // if we had the rest of the list stretched, then we could
        // add this.number to the front of this stretched list, stretch
        // that first item and then we'd be done.
    }
}

嘿,但不舒展应该这样做对我们来说,你知道,舒展整个名单? 我们不能使用它来拉伸列表的其余部分,以便我们可以轻松地拉伸第一项吗? 但是我们甚至还没有完成拉伸的工作-我的意思是-它没有用。 不可能那么容易,对吗? 可以吗

ListItem stretch(int n) {
    ListItem restOfList = this.next;
    if (restOfList == null) { // this list has length one
        return this.stretchFirstItem(n);
    } else {
        return restOfList     //-------------------------
           .magic(...)        // Left as an exercise for
           .moreMagic(...)    // the reader.
           .zyzzy(...);       //-------------------------
    }
}

家庭作业?

看来您应该建立一个链表,但是您要建立一个ListItems数组。 ListItems的数组不错 ,但是您需要使每个ListItem的下一个值指向列表中的下一个项目。

然后,函数的最后一行将返回列表中的第一项。

第一行加星号肯定是错误的,但是如果您考虑一下,那不是您的问题:首先不要求您返回数组。

如果考虑输入内容的实际情况,如何返回ListItem的问题应自行解决:拿一张纸,画一下,您将了解为什么返回一个列表项就足够了,以及如何处理列表项。 ListItem使每个项目加倍。

第一行的问题在于,由于this不是数组,因此无法下标( [i] )。 如果没有有关ListItem类的更多详细信息,我将无法帮助您解决该问题。 您在制作链表吗?

对于返回,您可能想返回数组中的第一项。 如果是这样,请将其更改为return newList[0] 如果要返回数组,请更改函数以返回数组,如下所示: public ListItem[] stretch(

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM