【问题标题】:Read list of type parameter values using Scanner.nextX that matches the type parameter使用与类型参数匹配的 Scanner.nextX 读取类型参数值列表
【发布时间】:2021-04-08 21:11:19
【问题描述】:

与此相关的帖子太多了,我认为参考它们不会有帮助,但如果人们发现特别有用的帖子,将它们添加到这里会很棒。

  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. 创建新列表的类型参数

到目前为止一切顺利。然而,我的程序重复了这个方法四次(我敢肯定,还会有更多),每一次都有不同的类型参数和 Scanner 方法。 (例如,ArrayList&lt;Double&gt;scnr.nextDouble()。)

我不怀疑我混淆了我使用过的许多其他语言的想法和技术,但是有什么方法可以概括这种方法,所以我可以告诉它我想要一个 ArrayList,比如说,Double 和它应该使用 Scanner.nextDouble()?这个问题的两个部分是 (a) 传递 ArrayList 的类型参数和 (b) 传递要使用的 Scanner 方法。

我会选择一个方法,其中指定或推导类型参数,并有一个枚举参数来告诉扫描器使用哪种方法,尽管两者是直接连接的。

【问题讨论】:

  • new ArrayList&lt;Integer&gt;() 可以是new ArrayList&lt;&gt;()
  • 就我个人而言,我会在List&lt;Integer&gt; lst = new ArrayList&lt;&gt;(); 声明并返回List&lt;&gt; 而不是ArrayList&lt;&gt;。编程到 (List) 接口,而不是 ArrayList 实现。

标签: java generics method-parameters


【解决方案1】:

您需要提供其他参数,例如:

  <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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2016-07-13
    相关资源
    最近更新 更多