2017-07-25 45 views
3

我遇到的问题与Java数组各地20000值,Java数组与各地20000值声明

全阵列可以发现here

我的代码:

public class UsableIDs { 

    private final static int idsArray[] = {615,616,617,618,...}; 
    private final static int ids = idsArray.length; 

    public static String checkID(int x){ 
     for(int i=0;i<ids;i++){ 
      if(x==idsArray[i]) 
       return "Usable"; 
     } 
     return "NotUsable"; 
    } 
} 

在我的另一种方法我试图用下面的方法调用它:

String temp = UsableIDs.checkID(xyz); 

在这里d oes程序崩溃总是崩溃

我使用NetBeans。

如果有人能帮助我得到这段代码,我会很高兴。

+0

为什么它崩溃? – hsz

+2

你的意思是* Programm崩溃总是崩溃*? – Blasanka

+0

您应该使用https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#binarySearch-int:A-int- here – 2017-07-25 11:42:49

回答

2

由于Java将静态初始化程序块的大小限制为65535字节,您将看到该错误。最好将数据与源代码分开,即将ID放入单独的文件中。

下面的代码与您的代码相同,假设数组内的数据存储为(以逗号分隔的,没有括号或换行符)到/temp/usableids.txt

import java.nio.file.Files; 
import java.nio.file.Paths; 

public class UsableIDs { 

    private final static int idsArray[]; 

    static { 
     try { 
      String fileData = new String(
       Files.readAllBytes(Paths.get("/temp/usableids.txt")), "UTF-8").trim(); 
      String[] ids = fileData.split(","); 
      idsArray = new int[ids.length]; 

      for (int i = 0; i < ids.length; i++) { 
       idsArray[i] = Integer.parseInt(ids[i]); 
      } 

     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public static String checkID(int x) { 
     for (int i = 0; i < idsArray.length; i++) { 
      if (x == idsArray[i]) 
       return "Usable"; 
     } 
     return "NotUsable"; 
    } 
} 
+0

thx为您提供帮助 – LosFaul

2

好吧,我已经测试过它自己了......它抛出的错误是Error:(13, 30) java: code too large,它是由数组初始化引起的,这个过程太长了。如果你需要这么多元素,你最好通过循环生成它们或者从文件中读取它们。

的ID的范围是615 - 18630,所以下面的代码应该做的伎俩:

public class UsableIDs { 

    private final static int LOWER_BOUND= 615; 
    private final static int UPPER_BOUND= 18630; 

    private final static int idsArray[] = generateIds(); 
    private final static int ids = idsArray.length; 

    private static int[] generateIds() { 
     int length = UPPER_BOUND - LOWER_BOUND + 1; 
     int[] array = new int[length]; 
     for(int i = 0; i < length; i++) { 
      array[i] = LOWER_BOUND+ i; 
     } 
     return array; 
    } 

    public static String checkID(int x){ 
     for(int i=0;i<ids;i++){ 
      if(x==idsArray[i]) 
       return "Usable"; 
     } 
     return "NotUsable"; 
    } 
} 
+1

或者他可以从资源中读取它 –

+1

如果查看数据,范围实际上是非连续的;有间隙,例如'698,700'和'792,800'。 –

+0

啊,在这种情况下,他不会从文件中读取它。 – QBrute

1

静态初始化有65535个字节的限制。所以它给你错误。相反,你可以把它放在文件中并读入数组。 enter image description here