【问题标题】:Correcting and Condensing Java Program纠正和压缩 Java 程序
【发布时间】:2016-01-30 06:25:41
【问题描述】:

我想我几乎已经搞定了我的 java 程序。它旨在通过使用 10 个不同的线程读取文本文件并找到最大的整数。我收到了这个错误:

Error:(1, 8) java: class Worker is public, should be declared in a file named Worker.java

我觉得我的代码可能比它需要的更复杂,所以我试图弄清楚如何缩小它的大小,同时修复上面的错误。非常感谢您在此问题上提供的任何帮助,如果我能澄清任何事情,请告诉我。另外,“工人”类是否必须是一个单独的文件?我将它添加到同一个文件中,但出现上述错误。

import java.io.BufferedReader;
import java.io.FileReader;

public class datafile {

    public static void main(String[] args) {
        int[] array = new int[100000];
        int count;
        int index = 0;
        String datafile = "dataset529.txt"; //string which contains datafile
        String line; //current line of text file

        try (BufferedReader br = new BufferedReader(new FileReader(datafile))) { //reads in the datafile
            while ((line = br.readLine()) != null) { //reads through each line
                array[index++] = Integer.parseInt(line); //pulls out the number of each line and puts it in numbers[]
            }
        }



            Thread[] threads = new Thread[10];
            worker[] workers = new worker[10];


            int range = array.length / 10;
            for (count = 0; count < 10; count++) {
                int startAt = count * range;
                int endAt = startAt + range;
                workers[count] = new worker(startAt, endAt, array);

            }

            for (count = 0; count < 10; count++) {
                threads[count] = new Thread(workers[count]);
                threads[count].start();
            }

            boolean isProcessing = false;
            do {
                isProcessing = false;
                for (Thread t : threads) {
                    if (t.isAlive()) {
                        isProcessing = true;
                        break;
                    }
                }
            } while (isProcessing);

            for (worker worker : workers) {
                System.out.println("Max = " + worker.getMax());
            }
        }


    }


     public  class worker implements Runnable {

        private int startAt;
        private int endAt;
        private int randomNumbers[];

        int max = Integer.MIN_VALUE;

        public worker(int startAt, int endAt, int[] randomNumbers) {
            this.startAt = startAt;
            this.endAt = endAt;
            this.randomNumbers = randomNumbers;
        }

        @Override
        public void run() {
            for (int index = startAt; index < endAt; index++) {

                if (randomNumbers != null && randomNumbers[index] > max)
                    max = randomNumbers[index];
            }
        }

        public int getMax() {
            return max;
        }

    }

【问题讨论】:

  • “解析时 EOF”问题是由源代码文件末尾的杂散 cloiseng 大括号 } 引起的。
  • 我也遇到了这个错误。我在工人阶级中固定了右括号。错误:(58, 1) java: 需要类、接口或枚举
  • 工人阶级的右大括号很好。 readTextFile 类的末尾有太多右大括号
  • 至于你问题的另一部分。有一个专门针对 Code Review 的 SE 网站,所以您最好去那里询问
  • 哦,等等,我修复了一个愚蠢的变量错误,并修复了右括号。我现在收到这个新错误。请参见上文。

标签: java multithreading algorithm syntax logic


【解决方案1】:

我已经写了一些 cmets,但我会将它们全部收集到一个答案中,以便将来任何人都可以看到汇总信息:

readtextfile 类的源代码末尾(根据 java 命名约定应该是 ReadTextile),你有太多右大括号,

    } while (isProcessing);

    for (Worker worker : workers) {
        System.out.println("Max = " + worker.getMax());
    }
}

}
}
        }

上面的内容应该在碰到最左边一列的第一个大括号上结束。在创建任何 Java 类时,这是一个很好的经验法则,如果您有多个最左大括号,或者您的最后一个大括号不是最左括号,那么您可能在某个地方犯了错误,应该检查您的大括号。

至于您的文件问题您应该将所有类命名为Java conventions,并且每个类都应该存储在一个名为 ClassName.java 的文件中(区分大小写)。例如:

public class ReadTextFile应该存储在ReadTextFile.java

你也可以让Worker 成为一个内部类。为此,您几乎可以将源代码复制到ReadTextFile 类中(确保它在main 方法之外)。请参阅this 有关内部类的教程以快速了解。

至于你的其他问题Code Review SE 是问这个问题的合适地方,那里的聪明人可能会提供比我更好的答案。不过,我还建议使用 10 个线程可能不是在文本文件中找到最大 int 的最有效方法(无论是在开发时间还是在执行时间上)。

【讨论】:

  • 感谢您的帮助。有时我会忽略最简单的事情。现在需要 10 个线程,所以我不能更改程序,只能对代码进行编码。
  • 您的意思是您将Worker 类作为内部添加到另一个类?您使用什么软件/命令来编译这些类?
  • 我只想在一个 .java 文件中而不是 2 个文件中。然后进行压缩。我正在使用 IntelliJ
  • 您不应编辑您的问题以提出更多问题。这个网站的用户不仅仅是你自己,而且进行这些编辑会使其他任何人都很难从问答中获得有用的信息。问题需要具体(即每个帖子仅限一个问题/问题)
  • this code 为例,这是您的编辑稍作改动的版本。将其保存为 DataFile.java,删除其他所有内容然后编译,然后返回此处并还原您的编辑,这样他们就不会删除其他用户的信息。最后阅读我的答案中链接的命名约定,否则您将继续遇到类似的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多