【问题标题】:Linked List Constructor with initial value具有初始值的链表构造函数
【发布时间】:2014-12-20 02:07:40
【问题描述】:

我正在处理一个链接列表项目,我在构造函数方面遇到了很大的麻烦。

我已经实现了默认构造函数(创建空列表。AKA data = null,size = 0)但是另一个构造函数真的让我很困惑!!!!

我想实现一个构造函数,它创建一个带有 valueS/elementS 的链表 (String[])。我的第一个想法是“小菜一碟,我所要做的就是:

  • 使用默认构造函数创建空链表
  • 在 for 循环中使用 for-each 循环。 for-each 循环是迭代字符串数组并将它们添加到我的空链表中。 需要 for 循环来跟踪索引。”

这是我的代码:

public LinkedList(String[] data)
{
    LinkedList l = new LinkedList();

    for (int i = 0; i <= data.length; i++)
    {

        for (String d : data)
        {
            l.add(d, i);
            i++;
        }

    }
}

我使用此构造函数测试了我的代码,但它不起作用。 我知道某处有一个愚蠢的错误,但我的逻辑/思想是盲目的。

【问题讨论】:

  • 你有什么异常吗?
  • 它不起作用”究竟是什么意思?
  • 为什么需要 2 个循环?
  • @sol4me 是的,我应该使用 this();而不是使用实际的构造函数
  • @PM77-1 我创建了一个字符串数组,然后我使用我的代码创建了一个链表,然后我尝试定位(get 方法)并检查(size 方法)但他们没有添加向上。我需要两个循环来跟踪索引并遍历数组。

标签: java arrays constructor linked-list nodes


【解决方案1】:

好吧,在您编写的构造函数中,您不再真正指的是“this”。您创建了一个链表 l 并修改了该链表,但您从未真正处理过“this”。我也同意其他人的观点,第二个 for 循环是不必要的。

这也让您可以使用this(),这是一个很酷的功能。帮助您保持代码干燥且无错误。

public LinkedList(String[] data){
    this(); //Call the default constructor to set up default properties
    for (String d : data){
        add(d); //Call on this
    }
}

【讨论】:

  • 您,先生,您最喜欢的啤酒值得我一品脱。我对“this”功能非常熟悉,事实上,我在大多数(90%)的其他方法中一直在使用它。但正如我之前所说的“我看不见它”谢谢,(即使我修复了它,我也必须处理其他“新生”错误。
【解决方案2】:

您需要更改 add 方法的参数,它希望索引是第一个参数。见http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#add(int,%20E)

    for (String d : data)
    {
        l.add(i, d);
        i++;
    }

【讨论】:

  • 完全正确,但我的 API 编写者将方法 add 描述为 public void add(java.lang.String data, int index)。参数是数据然后是索引。
【解决方案3】:

另一种方法是在循环中添加l.add(d)。有了这个新元素就可以保证被插入到列表的末尾。

当我想在给定位置插入时,我会使用l.add(i, d)

【讨论】:

    【解决方案4】:

    您的课程是否扩展LinkedList?如果是这样,我会这样做:

    public class MyLinkedList extends LinkedList<String> {
    
        ...
    
        public MyLinkedList(String... array) {
            super();
            if (array != null && array.length > 0) {
                for (String s : array) {
                    add(s);
                }
            }
        }
    
        ...
    
    }
    

    扩展 LinkedList 不是一个好主意。如果您想要一种简单的方法来创建包含元素的新 LinkedList,请使用以下方法:

    public static <E> LinkedList<E> newLinkedList(
            @SuppressWarnings("unchecked") final E... elements) {
        final LinkedList<E> list = new LinkedList<E>();
        Collections.addAll(list, elements);
        return list;
    }
    
    ....
    
    LinkedList<String> yourList = newLinkedList("foo", "bar", "baz");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      相关资源
      最近更新 更多