与 LinkedList 实现混淆



所以我的一部分功课是获取一串整数并将每个整数放在一个列表中,这就是我所做的:

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 循环获取项目并将它们放入列表中。我感到困惑的是,我看到人们使用 add 命令,括号内带有"new",如下所示:

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

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

我也看到有些人写过这个:

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

与我写的有什么区别吗?

构造

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

经常出现主要有两个原因:

  • a( 您不确定最适合您目的的集合是什么。有很多候选者:数组,集合,列表,向量,映射等,但您必须使用特定的东西。所以在右手边,它必须是具体的,但在左手边,你尽量敞开。

很多时候,你只是迭代集合,使用for循环,搜索,排序,放入,从中获取,删除。

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

  • b(如果你使用更广泛的对象,你会与外界兼容。当然,你不能使用像 Object 这样模糊的东西,因为 Object 没有 .add (E( 方法。

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

也许在基类中定义了 Linked~ 和 ArrayList 中的两个"子列表(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 ());
    }

函数Integer.parseInt返回一个new Integer,因此您不需要使用 new 关键字。

继续试验并使用IDE,如Eclipse,它将突出显示编译错误,您将很快学会该语言。 如果您仍然在苦苦挣扎,请阅读在线教程或询问您的教授。

你的代码很好。

以下:

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

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

至于List<Integer> booksList = ... vs LinkedList<Integer> booksList = ...,我认为前者风格稍微好一些。但是,有时需要使用后者。区别很大程度上是风格上的,我现在不会太担心。

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

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

当你写的时候

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

它的运行方式与

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

由于 new 关键字创建了一个绑定到名称 booksListLinkedList 对象。 booksList恰好是第一个示例中的 List 对象,LinkedList从中实现。

查看

文档并查看哪些数据结构实现了 List 接口。 您会惊讶于List<Integer> newList = new ....有多少种方式是有效代码。

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

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

相关内容

  • 没有找到相关文章

最新更新