所以我的一部分功课是获取一串整数并将每个整数放在一个列表中,这就是我所做的:
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 接口。 添加、删除和其他方法在LinkedList
和ArrayList
中的操作方式非常不同。
当你写的时候
List<Integer> booksList = new LinkedList<>()
它的运行方式与
LinkedList<Integer> booksList = new LinkedList<>()
由于 new
关键字创建了一个绑定到名称 booksList
的 LinkedList
对象。 booksList
恰好是第一个示例中的 List 对象,LinkedList
从中实现。
文档并查看哪些数据结构实现了 List 接口。 您会惊讶于List<Integer> newList = new ....
有多少种方式是有效代码。
没有提到的一件事是,在声明数据结构时,最好在所有尖括号中传递泛型类型。
即List<Integer> booksList = new LinkedList<Integer>()