java - 使用用户定义的 Scanner 类在 Java 中读取数据有什么意义?

标签 java user-defined

这段代码来自比赛,如果我使用内置的 Scanner 类来读取数据,它就可以正常工作。但是在这里,在这个原始的解决方案中,他们定义了一个自定义类 MyScanner 来读取数据?这是为什么?它与执行时间有什么关系还是有其他目的? 任何合理的解释或对相关概念的引用将不胜感激,在此先感谢。

class Main {
    final static int[] coins = {50, 25, 10, 5, 1};
    static int[][] memo;
    public static void main(String[] args) throws IOException{
        MyScanner sc = new MyScanner();
        Integer num = 7489 + 1;
        memo = new int[num+1][coins.length];
        for (int i = 0; i < num+1; i++) {
           Arrays.fill(memo[i], -1);
        }
        while ((num = sc.nextInt()) != null) {
            int r = change(num, 0);
            System.out.println(r);
        }
    }

    private static int change(int num, int cInd) {
        if (num < 0){
            return 0;
        } else if (num == 0 || cInd == coins.length-1){
            return 1;
        } else if(memo[num][cInd] != -1) {
            return memo[num][cInd];
        }else {
            int result = change(num, cInd+1) + change(num-coins[cInd], cInd);
            return memo[num][cInd] = result;
        }
    }

    static class MyScanner {
        BufferedReader br;
        StringTokenizer st;
        public MyScanner() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }
        public String next() throws IOException {
            if (st == null || !st.hasMoreTokens()) {
                String line = br.readLine();
                if (line == null){
                    return null;
                }
                st = new StringTokenizer(line);
            }
            return st.nextToken();
        }
        public Integer nextInt() throws IOException {
            String next = next();
            if (next != null) {
                return Integer.parseInt(next);
            } else {
                return null;
            }
        }
    }
}

最佳答案

在编程竞赛中,竞赛标准之一可能是参赛者的代码能够以多快的速度处理某些基于文本的输入文件。 您通常会看到使用这种东西(MyScanner 类),因为开发人员认为这使他或她在性能上比使用标准类具有“优势”。 “进入”竞争性编程的人将开发自己的个人工具包……以提高他们的优势。

尚不清楚此类是否真的总体上表现更好,或者对整体性能的贡献是否显着。需要:

  1. 编写一些通用基准测试,以及
  2. 描述竞争问题的解决方案。

但从某种意义上说,这并不重要。真正重要的是使用这种代码的人相信它更好。无论哪种方式,它都会做他们认为必要的事情。不择手段。


另一方面,如果你在生产代码中做这种事情,你可能会对你的项目/雇主造成伤害:

  1. 这种东西不太可能对现实生活中的应用有帮助。
  2. 您会以不必要/可能不稳定的代码形式增加技术负担,供您的同事/继任者维护。

只有当您的应用程序分析表明扫描是一个重要的性能瓶颈时,您才应该诉诸这种方法。

即便如此,这种事情也很可能是错误的:

        if (next != null) {
            return Integer.parseInt(next);
        } else {
            return null;
        }

因为它很可能成为意外 NPE 的来源。

关于java - 使用用户定义的 Scanner 类在 Java 中读取数据有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52353002/

相关文章:

java - 从 WinXP 启动 Luke(Java 应用程序)时出错

java - String args[] 参数是否创建 String 的新实例?

java - 关于如何在 Java 程序中创建用户定义变量的想法?

python - 如何打印具有用户定义属性的类的实例?

java - 在 Java 中计算包含变量的字符串形式的表达式

java - 我只是想知道为什么它必须在第二个循环中加入线程

java - 更新记录 if somcolumn! ="somevalue",使用 Hibernate saveorupdate()

javascript - 用户定义的 Html 标签

eclipse - 如何在 Eclipse 中的工作区之间复制用户库

android - 在 android 中分析用户定义的方法