1

当逻辑上某些事情看起来很简单时,结果却完全令人费解,

我用Java不多,所以请原谅我的无知。这是我正在尝试做的事情:

我在一个 .java 文件中有一个很好的干净算法,我想从一个初始化的数组中提供它。该数组包含超过 40,000 个元素,因此我希望它单独位于一个单独的文件中。我该怎么做呢?真的没有快速的方法只是说{在此处插入 filename.txt 的内容}?

4

6 回答 6

10

文件1.java:

class File1 {
    static int[] bigArray = {1,2,3};
}

文件2.java:

class File2 {
    static int main(String[] args) {
        doSomeThingWith(File1.bigArray);
    }
}

您也可以使用静态导入来使用 bigArray 而无需预先添加File1..

于 2009-09-13T09:34:57.860 回答
7

Java 中的基本代码单元是类,而不是文件。导入文件根本没有意义,这是错误的抽象级别。停止考虑文件 - 考虑不同类中的代码以及如何调用该代码。类在哪个文件中定义(而且它根本不必是文件!)并不重要。

顺便说一句,如果您直接在代码中定义它们,那么对于 40,000 个元素,您可能会遇到方法大小的限制。最好将数据放入文本文件并对其进行解析。这样,您在更改数据时也不必重新编译任何内容。

编辑:为文件编写解析器的另一种方法是计算一次数据,将其放入适当的 Java 数据结构(数组、列表、映射等),然后使用 ObjectOutputStream 将其序列化到文件中。请注意,如果数据存储在以后更改其签名的类中,这将导致问题。

于 2009-09-13T09:45:53.220 回答
1

请先阅读 Michael Borgwardt 的回答,这就像我想说的一样。

如果您需要一些素数,您可以即时计算它们:

/** Sieve of Eratosthenes. Return primes <= max */
static Integer[] getSoE(int max) {
    if (max < 1) return new Integer[0];

    BitSet sieve = new BitSet(max / 2);
    ArrayList<Integer> list = new ArrayList<Integer>();
    if (max > 1) list.add(2);
    if (max > 2) list.add(3);

    for (int i = 5, f = 1; i <= max; i += 3 - f, f = -f)
        if (sieve.get(i >> 1) == false) {
            for (int add, j = i + (add = i << 1); j < max; j += add)
                sieve.set(j >> 1, true);
            list.add(i);
        }

    return list.toArray(new Integer[0]);
}

假设您想从文件中读取它们:

static Integer[] getPrimeFromFile(String Filename) throws FileNotFoundException {
    ArrayList<Integer> list = new ArrayList<Integer>();

    Scanner sc = new Scanner(new File(Filename));
    while (sc.hasNext())
        list.add(sc.nextInt());
    sc.close();

    return list.toArray(new Integer[0]);
}
于 2009-09-13T10:52:26.877 回答
1

不,Java 中没有#include 工具。不包括 C 世界中已知的预处理器,它 - 一段时间后 - 结果证明可以制作更强大的程序(在我看来)。

您需要创建一个包含所需内容的新类,然后引用它。Java 6 允许静态导入,这使得这几乎是透明的。

请注意,您可能会冒达到单个类的最大字节码大小的风险。我相信它是 64 KB。

于 2009-09-13T09:47:46.887 回答
1

制作算法方法static,这样你就可以调用它Object whateverItReturns = NameOfClass.nameOfStaticMethod(args);

内容导入通常可以通过多种方式完成,具体取决于您要导出的内容类型以及更新方式是选择正确方式的关键。

于 2009-09-13T09:33:41.227 回答
0

在 Java 平台中,不预处理 .java 文件是经过深思熟虑的设计决定。这使事情变得简单,而简单就是 Java 的全部意义所在。

正如其他人所建议的那样,使用静态导入。有时感觉很有限,但不必调试 C 风格的宏地狱真是太好了。

于 2009-09-13T09:48:45.083 回答