使用与类型参数匹配的Scanner.nextX读取类型参数值的列表



与这篇文章相关的帖子太多了,我认为引用它们没有帮助,但如果人们发现特别有用的帖子,那么将它们添加到这里就太好了。

ArrayList<Integer> readIntegersFrom(Scanner scnr) {
ArrayList<Integer> lst = new ArrayList<Integer>();
while (scnr.hasNext()) {
lst.add(scnr.nextInt());
}
return lst;
}

整数出现在4个位置:

  1. 方法的名称
  2. ArrayList返回类型的Type参数
  3. lst类型的Type参数
  4. 用于创建新列表的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);

相关内容

  • 没有找到相关文章

最新更新