与Linked List实现相混淆

时间:2012-04-29 11:58:14

标签: java arrays linked-list

因此,我的家庭作业的一部分是获取一串整数并将其中的每一个放入一个列表中,这就是我所做的:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    String N;
    int count;        
    LinkedList<Integer> booksList = new LinkedList<>();


    System.out.printf("Give: ");
    N = input.nextLine();

    String[] arr = N.split(" ");        

    for (count = 0; count < arr.length - 2; count++) {            
        booksList.add(Integer.parseInt(arr[count + 2]));
    }

所以我所做的就是获取字符串,将其拆分为数组,然后将带有for循环的项目放入列表中。我感到困惑的是,我看到人们在括号内使用带有“new”的add命令,如下所示:

 booksList.add(new Integer.parseInt(arr[count + 2]));

这令我感到困惑,我不能完全确定我是否正确地做到这一点。 顺便说一下,我从count + 2中获取数组元素,因为我不需要答案的前两个元素,但我需要将前两个整数存储在两个单独的变量中。

我也看到有人写这个:

List<Integer> booksList = new LinkedList<>();

这与我写的有什么不同吗?

4 个答案:

答案 0 :(得分:3)

构造

List<Integer> booksList = new LinkedList<>();

通常主要有两个原因:

  • a)您不确定最适合您的收藏品是什么。有许多候选人:阵列,集合,列表,矢量,地图等,但你必须使用特定的东西。因此,在右侧,它必须是具体的,但在左侧,您尝试尽可能地敞开。

通常你只是迭代集合,使用for循环,搜索,排序,放入,取出,删除。

如果您发现,您的第一个想法的兄弟姐妹更适合,您可以稍后更改RHS,而无需重写您的程序的其余部分,因为,例如,LinkedList和ArrayList的大多数方法都填充相同合同,在清单中定义。

  • b)如果你使用更宽的物体,你会与外界联系。当然,你不能使用像Object这样模糊的东西,因为Object没有.add(E)方法。

但是对于排序,搜索等List非常适合。查看文档,比较List,LinkedList和ArrayList。尝试在代码中替换另一个。

在Linked~和ArrayList中可能有两个'sublist(int fromIndex,int toIndex)'方法在基类中定义,并且行为相同。

但也许它们是专门的,并且自己实现subList。这里我们有一个接口&lt; - 类关系,所以我们知道,接口中没有实现,它是完全抽象的。但是在(Abstract)基类&lt; - 派生类的情况下,模式是相同的。 派生/实现类共享相同的接口,“公共列表子列表(int fromIndex,int toIndex)”。你希望它们产生相同的结果,但是以不同的方式 - 也许。

只有当你需要调用一个只存在于LinkedList中的方法时,你才能声明你的bookList作为LinkedList,或者你为此目的投出它:

List<Integer> books = new LinkedList<>();
// ...
LinkedList <Integer> booksLiLi = (LinkedList <Integer>) books <> ();
// do something with booksLiLi which isn't defined on the List interface.

旁注:您的代码可以通过现代(7岁)的foreach循环进行简化:

Scanner input = new Scanner (System.in);
LinkedList<Integer> booksList = new LinkedList<>();
System.out.printf ("Give: ");
String N = input.nextLine ();
String[] arr = answer.split (" ");        

for (String num: arr) {            
    booksList.add (Integer.parseInt (num));
}
bookList.remove ();
bookList.remove ();

但是,如果您声明扫描仪,则可以直接从扫描仪中获取整数:

Scanner input = new Scanner (System.in);
LinkedList<Integer> booksList = new LinkedList<>();
System.out.printf ("Give: ");       

while (input.hasNextInt ()) {            
    booksList.add (input.nextInt ());
}
bookList.remove ();
bookList.remove ();

在回应评论时,这是第三个代码:从一行读取System.in然后在该行上创建一个扫描器:

    String line = input.nextLine (); 
    Scanner valueLine = new Scanner (line);
    List<Integer> books = new LinkedList<>();

    while (valueLine.hasNextInt ()) {            
        books.add (valueLine.nextInt ());
    }

答案 1 :(得分:1)

功能 Integer.parseInt会返回new Integer,因此您无需使用关键字。

继续尝试并使用Eclipse之类的IDE来突出编译错误,您将很快学会语言。如果您仍在努力阅读在线教程或询问您的教授。

答案 2 :(得分:1)

你的代码很好。

以下内容:

booksList.add(new Integer.parseInt(arr[count + 2]));

在语法上不正确,而你拥有的是。

关于List<Integer> booksList = ... vs LinkedList<Integer> booksList = ...,我认为前者的风格略好一些。但是,有时需要使用后者。差异主要是风格,我现在不会太担心它。

最后,我想回应其他人在评论中所说的内容:在首次使用变量时声明变量,而不是之前。另外,不要重复使用变量。

答案 3 :(得分:0)

Java中的List是一个接口,在特定的实现中定义了这些方法。例如,LinkedList实现List接口,并创建自己的add,delete和其他方法版本。这非常重要,因为其他数据结构(例如ArrayList)也实现了List接口。添加,删除和其他方法在LinkedListArrayList中的运作方式截然不同。

写作时

List<Integer> booksList = new LinkedList<>()

它的操作与

相同
LinkedList<Integer> booksList = new LinkedList<>()

因为new关键字创建了一个绑定到名称LinkedList的{​​{1}}对象。 booksList恰好是第一个示例中的List对象,booksList实现了该对象。

检查文档,看看哪些数据结构实现了List接口。 LinkedList是有效代码的方式会让您感到惊讶。

有一件事没有提到,在声明数据结构时,最好在所有尖括号中传递泛型类型。

List<Integer> newList = new ....

相关问题