【问题标题】:How to equal two 2d arrays together in java?java - 如何在java中将两个二维数组相等?
【发布时间】:2018-11-27 17:06:19
【问题描述】:

我创建了一些代码,如下所示,但是当我尝试使主 2D 数组等于新的 2D 数组内容时,它不起作用。我对二维数组很陌生,因此我们将不胜感激。

public class Simple2dArray {

private int row= 0;
private int column= 0;
private String [][] mainArray= null;

}

public static void main(String[] args){
   Simple2dArray array= new Simple2dArray (); // (class name is Simple2dArray)
   array.create2d();   //(calls out create2d)

  // array.addStartPosition(); //(calls out addStartPosition)


}

private void create2d(){
String line;


try { 
   FileReader fr= new FileReader("data.txt");
   BufferedReader br= new BufferedReader(fr);


   while ((line = br.readLine()) != null){

                ArrayList<String[]> arrayL= new ArrayList<>();
                while ((line = br.readLine()) != null){        
                String[] splitter= line.split(" ");
                arrayL.add(splitter);
                }//



     }

   }
   br.close();
  }catch (IOException e) {
      System.out.println("error");
  }


}

【问题讨论】:

  • 您的代码有编译错误。你能更新一下代码吗?
  • @ErandikaHarshani 我已经更新了代码。
  • @user7388968 2dArray 不能是变量名,并且 2dArray[i] = lists.get(i); 行中的 lists 未定义!
  • @Calaf 对此感到抱歉,这是一个示例,我现在已经编辑了代码。
  • 没问题!我正在研究您的解决方案...

标签: java multidimensional-array 2d bufferedreader


【解决方案1】:

这是我的解决方案。 您混淆了一些代码行,将它们放在 while 块中,并在 2dArray 填充期间忘记了 doubleFor。在以下代码中,您可以直接在 main2dArray 上工作。

首先,

private static String [][] main2dArray= null;

然后,在create2d()中,读取文件后,在arrayL中添加所有splitter

       ArrayList<String[]> arrayL= new ArrayList<>();
       while ((line = br.readLine()) != null){        
          String[] splitter= line.split(" ");
          arrayL.add(splitter);
       }

现在您可以复制 main2dArray 中的所有值,使用 double-For:

       main2dArray= new String[arrayL.size()][arrayL.get(0).length];
       for(int i = 0; i<main2dArray.length; i++) {
           for(int j=0; j<main2dArray[0].length;j++)
               main2dArray[i][j] = arrayL.get(i)[j];
       }

所以,当你调用 array.create2d(); (我没有修改它),输出是:

[[25, S, 92, 78, 2], [14, 21, 52, 2, 4], [2, 61, 11, 24, 7], [56, 45, 16, 57, 4 ], [32, 15, 98, 13, 6]]

字符“S”在正确的位置!

为避免误解,下面是带有cmets的完整代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

public class Ciao {
    private static String [][] main2dArray= null;

    public static void main(String[] args) throws IOException{
      array.create2d();   //(calls out create2d)
       addStartPosition();
    }

    private static void create2d(){
        String line;    
        try { 
           FileReader fr= new FileReader("data.txt");
           BufferedReader br= new BufferedReader(fr);

           ArrayList<String[]> arrayL= new ArrayList<>();
           while ((line = br.readLine()) != null){        
              String[] splitter= line.split(" ");
              arrayL.add(splitter);
           }//while

           main2dArray= new String[arrayL.size()][arrayL.get(0).length];
           for(int i = 0; i<main2dArray.length; i++) {
               for(int j=0; j<main2dArray[0].length;j++)
                   main2dArray[i][j] = arrayL.get(i)[j]; 
           }//for
           br.close();
        }catch (IOException e) {
            System.out.println("error");
        }//try-catch    
    }//create2d

    private static void addStartPosition() {
        main2dArray[0][1] = "S";
        System.out.println(Arrays.deepToString(main2dArray));
    }//addStartPosition

}//class

PS:我将您的方法设置为“静态”,因此删除了 Simple2dArray array= new Simple2dArray (); 行,但没有必要这样做。


EDIT1:我已经尝试过你的新代码(你可以从它的格式中看出我没有真正接触过它),如果我在 try-catch 块:


EDIT2:你不能在第一时间使用line = br.readLine(),否则内部循环会覆盖line的值。你必须使用另一种条件,根据你的平原...... 例如:

   boolean flag=true; //condition
   while (flag){

     switch (counter) {
        case (1):
            System.out.println ("case 1");
            break;
        case (2):
             System.out.println ("case 2");
            break;
        case (3):
              System.out.println("case 3");
            break;
        default:
            ArrayList<String[]> arrayL= new ArrayList<>();
            while ((line = br.readLine()) != null){
                //System.out.println(line);
                String[] splitter= line.split(" ");
                arrayL.add(splitter);
            }//
            mainArray= new String[arrayL.size()][arrayL.get(0).length];
            for(int i = 0; i<mainArray.length; i++) {
                for(int j=0; j<mainArray[0].length;j++)
                        mainArray[i][j] = arrayL.get(i)[j]; 
            } //for
         break;
        }//switch
       counter++;

       //for example, we can interrupt the cycle 
       flag=false; //You must set your own condition!
   }//while

现在您的输出将是:

...那应该是正确的!

【讨论】:

  • 是的,你可以将这个 while 转换成 for,但我认为问题不在我的代码中......原始代码中可能有一些变化你进入了我的周期。无论如何:for(int i=0; i==0;){ if( (line = br.readLine()) != null){String[] splitter= line.split(" ");arrayL.add(splitter); }else{i=1)}
  • 这样,for一直持续到i变成数字!= 0。原理和while一样。
  • 我已经在 Eclipse 上测试了你的新代码...它对我有用!我只在 try-catch 块之前添加了int counter=0;
  • 问题出在外面while...如果使用line=br.readline作为条件,line的第一个值会被内部覆盖while 阻塞条件!
  • 那么我该如何解决这个问题。我需要在第二个 while 循环中添加另一个条件吗?
【解决方案2】:

试试这个;

private void create2d() {
    String line;        

    try {
        FileReader fr = new FileReader("data.txt");
        BufferedReader br = new BufferedReader(fr);
        ArrayList<String[]> arrayL = new ArrayList<>();
        String[][] dataarray=null;
        while ((line = br.readLine()) != null) {                
            String[] splitter = line.split(" ");
            arrayL.add(splitter);

            // converts arraylist into 2d array.
            dataarray = new String[arrayL.size()][];
            for (int i = 0; i < dataarray.length; i++) {
                dataarray[i] = arrayL.get(i);
            }


        }
        System.out.println(Arrays.deepToString(dataarray));
        mainArray = new String[arrayL.size()][];
        mainArray=Arrays.copyOf(dataarray, dataarray.length);   
        br.close();

    } catch (IOException e) {
        System.out.println("error");
    }

}

private void addStartPosition() {

    mainArray[0][1] = "S";

    System.out.println(Arrays.deepToString(mainArray));

}

【讨论】:

    【解决方案3】:

    如果您使用 Arraylist:::,您的预期输出将是这样的

    public class Simple2dArray {
        private int row = 0;
        private int column = 0;
        private static String[][] main2dArray = null;
    
        public static void main(String[] args) throws IOException {
    
            FileReader fr = new FileReader("E:\\Projects\\JavaBasics\\src\\data.txt");
            BufferedReader br = new BufferedReader(fr);
            String line;
    
            ArrayList<String> stringArray = new ArrayList<>();
            while ((line = br.readLine()) != null) {
                stringArray.add(line);
            }
            main2dArray = new String[stringArray.size()][stringArray.get(0).split(" ").length];
            int lineNo =0;
            for (String inLine:stringArray)
            {
                String[] splitter = inLine.split(" ");
    
                for (int i=0;i<splitter.length;i++)
                {
                    main2dArray[lineNo][i] = splitter[i];
                }
                lineNo++;
            }
            printArray(main2dArray);
            // I dont know why you want to replace this position. if its unintentionaly please remove.
            main2dArray[0][1]="S";
            System.out.println(Arrays.deepToString(main2dArray));
        }
    
        private static void printArray(String[][] arrays) {
            for (int i =0; i<arrays.length;i++)
            {
                System.out.printf("[");
                for (int j = 0;j<arrays[i].length;j++){
                    System.out.printf(" %s ",arrays[i][j]);
                }
                System.out.printf("]");
                System.out.println();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2018-12-16
      • 2012-03-08
      • 1970-01-01
      • 2013-09-21
      • 2022-11-18
      相关资源
      最近更新 更多