Java 2d Array无法编辑值并正确返回元素返回空值

时间:2016-05-13 08:18:29

标签: java arrays multidimensional-array

我对java语言的了解非常新。我的大部分知识来自谷歌搜索如何做事。我一直在研究使用switch语句的java控制台程序。整个程序使用String [20] [5]数组。我已经编写了代码,现在可以添加条目,将数组保存到文件,将文件中的条目加载到数组中。

现在的问题是编辑和删除条目。我能够将值返回null但它看起来像[[null],[null,null,null,null,null]。

我希望该值返回[null,null,null,null,null],[null,null,null,null,null]。

Edit条目有些原因会返回java.lang.ArrayIndexOutOfBoundsException:1。

有人可以指出我的错误吗? Array也是全局声明的。

public static String[][] rem(){
 Scanner input = new Scanner(System.in);
 int x,y=0;
 //for(int i=0;i<array.length;i++){
        //if(array[i][0]!=null){
            System.out.println(Arrays.deepToString(array));//}
        //}
 System.out.println("Which entry would you like to remove? "
         + "\n" + "Enter number 0 - 20");
 x = input.nextInt();
 array[x][y]=null;
 return array;}


public static String[][] edit(){
 Scanner input = new Scanner(System.in);
 String k;
 int j;
 int g;
// for(int i=0;i<array.length;i++){
        //if(array[i][0]!=null){
            //System.out.println(Arrays.deepToString(array));}
        //}
 System.out.println("Which entry would you like to edit? "
         + "\n" + "Enter number 0 - 20");
 j = input.nextInt();
 System.out.println("What would you like to edit? "
         +"\n" + "Enter number 0 - 5");
 g = input.nextInt();
 System.out.println("You are now editing.");
 k = input.next();
 array[j][g] = k;
 return array;}

更新

我想我认为我的问题。数组正确编辑我手动输入的值。当我将数据加载到导致问题的数组中时,因为当它加载数据时它会加载为String []。我需要一个代码,将数据加载为String [] []或数组数组。

public static String[][] load()throws FileNotFoundException, IOException{
  menu();
  copyFile();
  String file = ("c:/temp/Address.txt");
    Scanner scan = new Scanner(new FileReader(file));
    // initialises the scanner to read the file file

    //String[][] entries = new String[100][3];
    // creates a 2d array with 100 rows and 3 columns.
    //int i = 0;
    while(scan.hasNextLine()){
        array[i][i] = scan.next().split("," , "\t");
        i++;
    }
    //loops through the file and splits on a tab

    //for (int row = 0; row < array.length; row++) {
       // for (int col = 0; col < array[0].length; col++) {
           // if(array[row][col] != null){
               // System.out.print(array[row][0] );
           // }
       // }
       // if(array[row][0] != null){
           // System.out.print("\n");
        //}
   // }
    //prints the contents of the array that are not "null"
    selectMenu();
    return array;}

更新2

我找到了解决加载数据问题的解决方案。解决方案很简单!我将把代码留在这里以供参考。虽然,所有的代码都可以使用一些美化。

public static String[][] load()throws FileNotFoundException, IOException{
  menu();
  copyFile();
  String file = ("c:/temp/Address.txt");
    Scanner scan = new Scanner(new FileReader(file));
    FileReader fr = new FileReader("c:/temp/Address.txt");
    BufferedReader br = new BufferedReader(fr);

    //int j=0;
    //int lineNo = 0;
     //String line = br.readLine();
     //while(line!=null)
     //{  
        //for(int i = 0; i < 5; i++)
        //{
           //array[lineNo][i] = line.substring(i,4);  
        //}
       // lineNo++;
        //line = br.readLine();  // This is what was missing!
     //}     
    //while(scan.hasNextLine()){
    //while(scan.hasNext()){
        //for(j=0;j<5;j++){
    for(int i = 0; i < 20; ++i){
        for(int j = 0; j < 5; ++j)
        {
            if(scan.hasNext())
            {
    array[i][j] = scan.next();
        //i++;
        //j++;
                }
    //i++;
            }
        }

    selectMenu();
    return array;}

更新3

因此在弄清楚如何使用分隔符后,它给我一个奇怪的问题。它在列的末尾添加了返回值。 [null,null,null,null,null return]。我使用“,| \ n”作为我的分隔符。有更好的方法吗?更新:添加.trim();用load来解决最后的问题。现在它在当前的工作中已经完善了。虽然,我确信可能会有较少的原始方法。

    public static String[][] load()throws FileNotFoundException, IOException{
   copyFile();
 //delimiter removes the comma or return to the next line. "\n" new line
   Scanner scan = new Scanner(new FileReader(file)).useDelimiter(",|\n"); 
    for(int i = 0; i < 20; ++i){
        for(int j = 0; j < 5; ++j){
                if(scan.hasNext())
                array[i][j] = scan.next().replace(",", "").trim();
            }
        }
    System.out.println("File loaded successfully!!");
    scan.close();
    return array;}

1 个答案:

答案 0 :(得分:0)

这是一个错误,非常微妙的错误:

虽然您有20行和5列,但数组使用基于0的索引(从0开始计数而不是1)。 用你的手指从0到5计数,你会发现实际上有6个数而不是5个,这导致你的OutOfBoundsException,因为你没有第6个元素。 因此,要访问您的行和列,范围应介于: 0 - 19(对于列)和0 - 4(对于行)

1 - 20(对于列)和1 - 5(对于行)然后从扫描仪输入中减去1,因为记住数组使用基于0的索引。

更新文件读取:

public static String[][] load() {

   try{
      FileReader fr = new FileReader("c:/temp/Address.txt");
      BufferedReader bf = new BufferedReader(fr);
      String presentLine = "";
      for(int i = 0; i < 20; i++) {
        for(int j = 0; i < 5; j++) {
             if ((presentLine = bf.readLine()) != null) {
                   array[i][j] = presentLine;
             }
        }
      }
   } catch(Exception e) {
      System.out.println(e);
   }

   selectMenu();
   return array;
}

虽然这可以做得更好但是没关系。 您可以将20和5分别存储为称为行和列的静态变量,以避免使用硬编码数字。