2

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

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

4 回答 4

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 。这里我们有一个接口 <- 类的关系,所以我们知道,接口中没有实现,它是完全抽象的。但是在(抽象)基类<-派生类的情况下,模式是相同的。派生/实现类共享相同的接口,“public List sublist (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,你可以直接从 Scanner 中获取 Integers:

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 中读取一行,然后在该行上创建一个 Scanner:

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

    while (valueLine.hasNextInt ()) {            
        books.add (valueLine.nextInt ());
    }
于 2012-04-29T12:15:12.030 回答
1

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

继续试验并使用 Eclipse 之类的 IDE,它会突出显示编译错误,您很快就会学习该语言。如果您仍然在努力阅读在线教程或询问您的教授。

于 2012-04-29T12:05:41.233 回答
1

你的代码很好。

以下:

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

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

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

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

于 2012-04-29T12:11:04.580 回答
0

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

当你写

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

它的运作方式与

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

因为new关键字创建了一个LinkedList绑定到 name 的对象booksListbooksList恰好是第一个示例中的 List 对象,从中LinkedList实现。

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

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

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

于 2012-04-29T12:18:57.860 回答