【问题标题】:Implementing a new LinkedList method in Java在 Java 中实现一个新的 LinkedList 方法
【发布时间】:2012-08-21 14:13:15
【问题描述】:

我有一个任务涉及创建三个操作链表的方法。说明要求我使用以下构造函数:

 public MyList (LinkedList<Integer> list) {
 ...
 }

但是,无论我如何尝试集成,Eclipse 似乎都不喜欢我的代码。这是我目前的尝试:

import java.util.*;

public class ListClass {

public static void main(String[] args) {
    LinkedList<Integer> list = new LinkedList<Integer>();
    list.add(10);
    list = MyList(list);
}

public MyList (LinkedList<Integer> list){
    LinkedList<Integer> r = list;
    return r;
}
}

现在我认为上面的 MyList 构造函数会很高兴地返回输入的列表,但是我的 Java 技能真的很弱。我一直在阅读教程并尝试了一下,但它并没有像我想象的那样奏效。

无论如何,Eclipse 给了我两个错误 - 在“list = MyLIst(list);”它说方法 MyList 未为 ListClass 定义,在“public MyList”行它说“方法的返回类型丢失” - 但我告诉它 r 是一个链表,并返回它。

这伤害了我的大脑,我无法弄清楚,谁能帮我一把?我想如果我能够让上面的代码工作,我应该能够把剩下的排序。

较新的代码

正如正确指出的那样,我的类名与我假定的构造函数名不同。所以这里是调整后的代码:

import java.util.LinkedList;

public class MyList {

public static void main(String[] args) {
    LinkedList<Integer> list = new LinkedList<Integer>();
    list.add(10);
    list.add(-20);
    MyList(list);
}

public MyList(LinkedList<Integer> list) {
    LinkedList<Integer> newList = list;
    System.out.println(newList);    
}
}

这已经解决了“返回类型”错误(谢谢),尽管我仍然收到“未定义”错误。

【问题讨论】:

  • 我有一个任务……”。也许你应该把它标记为家庭作业?
  • MyList 方法不是构造函数,因为它与类的名称不同
  • 完成了,没想到这是共同政策
  • 编译器期望您的公共 MyList 返回一个 MyList。由于它不在 MyList 类中,因此它不是构造函数,它是一个采用 LinkedList 并返回 myList 的方法。但是,您实现它的方式是返回 LinkedList 而不是 MyList(这是它所期望的)
  • 我建议研究一下 Java 编程中的构造函数是什么,以及你能用它做什么和不能做什么。完成后,请使用生成的代码进行更新。

标签: java eclipse class linked-list


【解决方案1】:

您的方法MyList 的声明中缺少的是方法的返回类型:

public MyList (LinkedList<Integer> list)

应该是这样的

public LinkedList<Integer> MyList (LinkedList<Integer> list)

除此之外,方法名称的通常约定是驼峰式,但以小写字母开头。我将其称为 myList 而不是 MyList(您应该为该方法选择一个更好的名称,以反映该方法的目的)。

【讨论】:

  • 看起来我的问题的一部分是类名与构造函数名称不同 - 在修复返回类型问题后已解决。
【解决方案2】:

如果

public MyList (LinkedList<Integer> list) {
 ...
}

应该是一个构造函数,这个类也必须命名为MyList。您不能从构造函数返回任何内容,因此只需保留它的声明即可。

只需重命名您的类,将LinkedList 保存到上面构造函数中的私有字段,然后将您应该实现的方法添加到MyList 类。

要摆脱未定义的问题,您需要使用 'new' 创建列表:

MyList myList  = new MyList(list);

【讨论】:

  • 你说的很对,我已经添加了更新的代码。仍然需要解决“未定义”问题 - 只需考虑您评论的第二部分。
  • 啊是的,就是这样。而且您只需击败 Filipe 就可以成功 - 感谢您的帮助!
【解决方案3】:

使用您修改后的代码,还有一些地方需要更正:

  1. 在Java 中,您调用构造函数来创建一个新的Object。您可能希望在创建此对象时将其作为main() 方法的一部分保留,使用类似以下内容以防止出现“未定义”错误:

    MyList ml = new MyList(list);
    
  2. 作为构造函数的一部分,您只存储作为局部变量传入的LinkedList&lt;Integer&gt;,而不是作为类变量。在您的班级顶部使用以下声明更正此问题:

    public class MyList {
        private LinkedList<Integer> list;
        //...
    

附加功能的结构

为了添加您在下面评论中描述的附加功能,我将使用以下类型的结构(显然您仍然需要实现这些方法,但您可以看到我将它们放在哪里):

import java.util.LinkedList;

public class MyList {
    private LinkedList<Integer> list;

    public MyList(LinkedList<Integer> list) {
        this.list = list;
    }

    public LinkedList<Integer> reverse() {
        //Create a reversed list

        return rList;
    }

    public LinkedList<Integer> odd() {
        //Create a list of the odd elements

        return oddList
    }

    public LinkedList<Integer> even() {
        //Create a list of the even elements

        return evenList;
    }

    @Override
    public String toString() {
        return list.toString();
    }

    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(0);
        list.add(2);
        list.add(4);

        MyList ml = new MyList(list);
        System.out.println("MyList: " + ml);
        LinkedList<Integer> tsil = ml.reverse();
        System.out.println("Reversed: " + tsil);
        LinkedList<Integer> ls = ml.odd();
        System.out.println("Odd: " + ls);
        LinkedList<Integer> it = ml.even();
        System.out.println("Even: " + it);
    }
} 

【讨论】:

  • 目前代码很不完整。它最终要做的是获取一个 LinkedList 并具有一个 reverse() 方法、一个 getEven() 方法和一个 getOdd() 方法,所有这三个方法都返回适当的 LinkedList。尽管不幸的是,我现在正在努力使这三种方法中的任何一种都起作用。我被指示将方法标题写为“public LinkedList reverse()”,但是当我在 LinkedList 上使用它时,它说反向()对于 LinkedList 是未定义的。如果我执行“public MyList reverse()”,它似乎适用于 MyList。看来我不知道自己在做什么。
  • @andrewb 我已经更新了我的答案,以展示我将如何构建课程。请注意reverse()MyList 类的方法,而不是LinkedList,因此您需要调用mylist.reverse() 而不是linkedlist.reverse()(其中mylistlinkedlistMyList 和@ 的实例987654334@个班级)
  • 太棒了,谢谢。我设法将其余部分整理出来,因此我的代码看起来与您的非常相似,这让人非常放心。鉴于您的答案的扩展,我现在将您的答案标记为正确的答案。我现在觉得我对自己在做什么有了一些想法,学习很好!
【解决方案4】:

这里的问题是构造函数必须与其封闭类具有相同的名称。但是,您尝试在名为 ListClass 的类中命名 MyList 构造函数。

所以,要么将你的类和构造函数都命名为 MyList,要么将它们命名为 ListClass。

至于“未定义”的问题,不能直接调用构造函数。您必须在“new”语句中使用它,因为它用于创建类的新实例:

MyList someList = new MyList(); // variable someList will hold a new MyList instance

new MyList(); // instance without a reference variable.

【讨论】:

  • 你说得对,我已经添加了更新的代码 - 仍然需要修复“未定义”问题。
  • 我试过“MyList someList = new MyList();”但这标志着构造函数未定义的错误。当我执行“MyList newList = new MyList(list);”时,它很高兴。由于它是构造函数,我认为您需要填写构造函数字段。不过这很好,整个“构造函数”现在变得更有意义了。
猜你喜欢
  • 1970-01-01
  • 2012-11-15
  • 2016-12-12
  • 2021-09-18
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
相关资源
最近更新 更多