【问题标题】:Simple Java List Question简单的 Java 列表问题
【发布时间】:2009-10-25 21:05:16
【问题描述】:

我应该创建一个迭代方法stretch,它以一个正数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;****************
    }

}

有两个问题点,我在这两个问题上加了星标。我应该返回一个列表项,但 NewList 是一个数组。 而且我不确定第一条星号线有什么问题。

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

【问题讨论】:

  • 这是什么类型的?不知道你为什么要为其编写脚本。
  • 圣哈辛托的意思是 this[i];部分几乎肯定是错误的。

标签: java algorithm list


【解决方案1】:

解决这个问题的最好方法是画一些图片。然后尝试将问题分解为子问题。让我们从简单的情况开始:长度为 2 的列表:

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

这是一张照片

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

这是另一张照片:

+---+ +---+ 这里的“/”是上面的“null”,它终止了列表。 | 1 |->| 2 |-/ +---+ +---+

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

现在,当我们被要求“拉伸”一个列表时,到底发生了什么?比方说,到 2 点?

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

我们有:

我们有我们想要的 +---+ +---+ +---+ | 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(), 虽然没有必要。我只是想清楚 这些是对当前对象 (this) 的方法调用。

但是,假设我们想要拉伸更大的 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.
    }
}

嘿,但 stretch 不应该为我们这样做吗,你知道,拉伸整个列表吗?难道我们不能用它来拉伸列表的其余部分,这样我们就可以做简单的事情并拉伸第一项吗?但是我们甚至还没有写完拉伸——我的意思是——它不起作用。不可能那么容易,不是吗?可以吗?

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(...);       //-------------------------
    }
}

【讨论】:

    【解决方案2】:

    家庭作业?

    看起来您应该构建一个链表,但您却构建了一个 ListItems 数组。 ListItems 数组并不不好,但您需要使每个 ListItem 的 next 值指向列表中的下一项。

    那么你函数的最后一行将返回列表中的第一项。

    【讨论】:

    • 对不起,我是java新手。你能说得更详细一点吗?我不希望您编写代码,因为那样我就无法学习,但是有关该主题的更多细节可能会有所帮助。谢谢。
    • 如果您首先有一个 ListItem,然后有一个 ListItem,那么您需要执行类似 first.next = second; 的操作。让第一个 ListItem “知道”它之后的那个。
    【解决方案3】:

    第一行加星号肯定是错误的,但如果你仔细想想,这不是你的问题:你一开始就没有被要求返回一个数组。

    如果您考虑一下输入的真实情况,如何返回 ListItem 的问题应该会自行解决:拿一张纸,画出来,您就会明白为什么返回单个列表项就足够了,以及什么在 ListItem 上执行以使每个项目加倍。

    【讨论】:

      【解决方案4】:

      第一行的问题是因为this 不是一个数组,所以你不能下标它([i])。如果没有有关您的 ListItem 课程的更多详细信息,我无法帮助您解决这个问题。你在做一个链表吗?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        相关资源
        最近更新 更多