当逻辑上某些东西看起来好像很简单时,它就会变得完全错综复杂,
我没有太多使用Java,所以请原谅我的无知。这是我想要做的:
我在一个.java文件中有一个很好的干净算法,我想从一个初始化的数组中提供它。该数组包含超过40,000个元素,因此我希望它本身就是一个单独的文件。我该怎么做呢?是否真的没有快速的方法来说{在这里插入filename.txt的内容}?
答案 0 :(得分:10)
File1.java:
class File1 {
static int[] bigArray = {1,2,3};
}
File2.java:
class File2 {
static int main(String[] args) {
doSomeThingWith(File1.bigArray);
}
}
您也可以使用静态导入来使用bigArray,而无需预先File1.
。
答案 1 :(得分:7)
Java中的基本代码单元是类,而不是文件。导入文件根本没有意义,这是错误的抽象级别。不要考虑文件 - 考虑不同类中的代码以及如何调用该代码。该类定义在哪个文件中(并且它根本不必是文件!)并不重要。
BTW,如果您直接在代码中定义方法,则有40,000个元素可能会遇到方法大小的限制。将数据放入文本文件并解析它会更好。这样,您也不必在更改数据时重新编译任何内容。编辑:为文件编写解析器的另一种方法是计算一次数据,将其放入适当的Java数据结构(数组,List,Map等),然后序列化使用ObjectOutputStream进入文件。请注意,如果数据存储在稍后更改其签名的类中,则会导致问题。
答案 2 :(得分:1)
制作算法方法static
,这样就可以通过Object whateverItReturns = NameOfClass.nameOfStaticMethod(args);
内容导入通常可以通过多种方式完成,具体取决于您要导出的内容类型以及更新方式,这是选择正确方法的关键。
答案 3 :(得分:1)
不,Java中没有#include工具。从C世界中已知的预处理器没有被包括在内,经过一段时间后,结果是制作出更强大的程序(在我看来)。
您需要创建一个包含所需内容的新类,然后引用它。 Java 6允许静态导入,这使得它几乎透明。
请注意,您可能会冒险达到单个类的最大字节代码大小。我相信它是64 Kb。
答案 4 :(得分: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]);
}
答案 5 :(得分:0)
Java平台中的故意设计决定是不预处理.java文件。这使事情变得简单,简单就是Java的全部内容。
正如其他人所建议的那样,使用静态导入。有时它感觉有限,但不用调试C风格的宏地狱就好了。