使用匹配类型参数的 Scanner.nextX 读取类型参数值列表
Read list of type parameter values using Scanner.nextX that matches the type parameter
与此相关的帖子太多,我认为引用它们没有什么帮助,但如果人们发现特别有用的帖子,将它们添加到这里会很棒。
ArrayList<Integer> readIntegersFrom(Scanner scnr) {
ArrayList<Integer> lst = new ArrayList<Integer>();
while (scnr.hasNext()) {
lst.add(scnr.nextInt());
}
return lst;
}
整数出现在4处:
- 方法名称
- ArrayList的Type参数return类型
- lst类型的Type参数
- 创建新列表的类型参数
到目前为止一切顺利。但是,我的程序将此方法复制了四次(我敢肯定,还会有更多次),每次都使用不同的类型参数和 Scanner 方法。 (例如,ArrayList<Double>
和 scnr.nextDouble()
。)
我不怀疑我混淆了我使用过的许多其他语言的想法和技术,但是有什么方法可以概括这种方法,这样我就可以告诉它我想要一个 ArrayList,比如说,Double,它应该使用 Scanner.nextDouble()?这个问题的两个部分是 (a) 传达 ArrayList 的类型参数和 (b) 传达要使用的 Scanner 方法。
我会满足于指定或推导类型参数的单一方法,并有一个枚举参数来告诉扫描器使用哪个方法,尽管这两者是直接连接的。
您需要提供额外的参数,例如:
<T> ArrayList<T> readFrom(BooleanSupplier hasNext, Supplier<T> supplier) {
ArrayList<T> lst = new ArrayList<>();
while (hasNext.getAsBoolean()) {
lst.add(supplier.get());
}
return lst;
}
然后像这样调用:
ArrayList<Integer> intList = readFrom(scnr::hasNextInt, scnr::nextInt);
ArrayList<Double> doubleList = readFrom(scnr::hasNextDouble, scnr::nextDouble);
ArrayList<String> stringList = readFrom(scnr::hasNext, scnr::next);
如果您不想在每个调用站点都使用它,您可以定义简单的辅助方法:
ArrayList<Integer> readIntegersFrom(Scanner scnr) {
return readFrom(scnr::hasNextInt, scnr::nextInt);
}
ArrayList<Double> readDoublesFrom(Scanner scnr) {
return readFrom(scnr::hasNextDouble, scnr::nextDouble);
}
// etc
并像这样调用:
ArrayList<Integer> intList = readIntegersFrom(scnr);
ArrayList<Double> doubleList = readDoublesFrom(scnr);
与此相关的帖子太多,我认为引用它们没有什么帮助,但如果人们发现特别有用的帖子,将它们添加到这里会很棒。
ArrayList<Integer> readIntegersFrom(Scanner scnr) {
ArrayList<Integer> lst = new ArrayList<Integer>();
while (scnr.hasNext()) {
lst.add(scnr.nextInt());
}
return lst;
}
整数出现在4处:
- 方法名称
- ArrayList的Type参数return类型
- lst类型的Type参数
- 创建新列表的类型参数
到目前为止一切顺利。但是,我的程序将此方法复制了四次(我敢肯定,还会有更多次),每次都使用不同的类型参数和 Scanner 方法。 (例如,ArrayList<Double>
和 scnr.nextDouble()
。)
我不怀疑我混淆了我使用过的许多其他语言的想法和技术,但是有什么方法可以概括这种方法,这样我就可以告诉它我想要一个 ArrayList,比如说,Double,它应该使用 Scanner.nextDouble()?这个问题的两个部分是 (a) 传达 ArrayList 的类型参数和 (b) 传达要使用的 Scanner 方法。
我会满足于指定或推导类型参数的单一方法,并有一个枚举参数来告诉扫描器使用哪个方法,尽管这两者是直接连接的。
您需要提供额外的参数,例如:
<T> ArrayList<T> readFrom(BooleanSupplier hasNext, Supplier<T> supplier) {
ArrayList<T> lst = new ArrayList<>();
while (hasNext.getAsBoolean()) {
lst.add(supplier.get());
}
return lst;
}
然后像这样调用:
ArrayList<Integer> intList = readFrom(scnr::hasNextInt, scnr::nextInt);
ArrayList<Double> doubleList = readFrom(scnr::hasNextDouble, scnr::nextDouble);
ArrayList<String> stringList = readFrom(scnr::hasNext, scnr::next);
如果您不想在每个调用站点都使用它,您可以定义简单的辅助方法:
ArrayList<Integer> readIntegersFrom(Scanner scnr) {
return readFrom(scnr::hasNextInt, scnr::nextInt);
}
ArrayList<Double> readDoublesFrom(Scanner scnr) {
return readFrom(scnr::hasNextDouble, scnr::nextDouble);
}
// etc
并像这样调用:
ArrayList<Integer> intList = readIntegersFrom(scnr);
ArrayList<Double> doubleList = readDoublesFrom(scnr);