2011-12-04 38 views
1

好吧,我已经难倒了最好的方法来做到这一点,我写了代码从txt文件中读取代码行为List。然后,我可以打印特定部分或将其转换为对象数组。但是,最终我想只有一个可以在C/C++中经常看到的2d int数组。谈到java时,我非常青睐,只是本周早些时候才开始。我一直喜欢它,直到在运行时创建动态二维数组为止。你们中的任何一个人都可以提出一个从我当前卡住的地方进入2d int数组的好方法。我正要使用'toChar'将它转换为char数组,然后将(value @ index-48)存储到它的相应位置,但对我来说这似乎很不起眼。列表<String> ----> int [] [] arr

====更新==========================

嗯,感谢所有的答复,但我只是想出了如何使用双打来做到这一点,所以对于其他人来说,在这里你走了。我仍然宁愿int,因为我已经使用这种类型构建了我的其他matrixops类,但Double不应该是我猜测的问题。

package uaa.cse215; 
import java.io.*; 
import java.util.*; 


public class ReadMatrix { 
    private Double[][] A; 
    private Double[][] B; 
    private int count; 

    public int filedir(String matrix) throws Exception{ 
     Double[][] Temp; 
     String[] arr; 
     BufferedReader rd = new BufferedReader(new FileReader(matrix)); 
     String s; 
     List<String> textFile = new ArrayList<String>(); 
     while ((s=rd.readLine())!=null) { 
      textFile.add(s); 
      } 
     String splitarray[] = textFile.get(0).split(" ");//run once to grab # cols 
     int rows = textFile.size();//number of rows 
     int cols = splitarray.length;//number of cols 
     Temp = new Double[rows][cols]; // now can initiate array 
      for (int i=0; i<rows; i++) { 
       s = textFile.get(i); 
       arr = s.split(" "); 
       for (int j=0; j<cols; j++) { 
        Temp[i][j] = Double.parseDouble(arr[j]); 
       } 
      } 
      count++; 
      if (count == 1){ 
       A = Temp; 
      } 
      else 
       B = Temp; 


      rd.close(); 
      return(1); 
      } 
} 

回答

0

如果输入矩阵dimentions是动态的或锯齿状的,你可以使用

List<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); 

阅读数量和比它复制到原始二维数组,如果你想要的。

java.util。扫描仪具有从输入读“类型”数据很多方便的方法

下面是一个例子把文件读入二维数组

public static int[][] read2DArray(String fileName) throws FileNotFoundException { 

     Scanner sc = null; 

     List<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); 

     int columnCount = 0; 
     int[][] arr = null; 

     try { 

      sc = new Scanner(new File(fileName)); 

      while (sc.hasNextLine()) { 

       // Read line 
       String line = sc.nextLine(); 

       // Split it 
       String[] nums = line.split(" "); 

       if (nums.length > columnCount) { 
        columnCount = nums.length; 
       } 

       // Convert to integers and add to list 
       list.add(new ArrayList<Integer>()); 
       for (String n : nums) { 
        list.get(list.size() - 1).add(new Integer(n)); 
       } 
      } 

      // Convert list to array 
      int rowCount = list.size(); 
      arr = new int[rowCount][columnCount]; 
      for (int i = 0; i < rowCount; i++) { 
       for (int j = 0; j < list.get(i).size(); j++) { 
        arr[i][j] = list.get(i).get(j); 
       } 
      } 

     } finally { 
      if (sc != null) { 
       sc.close(); 
      } 
     } 

     return arr; 
    } 
+0

你在这2个小时前在哪里哈哈。我一直在寻找这样的东西,并与评论!非常感谢 –

2

请注意,Java有char数据类型,是一个16位无符号整数拿着UTF-16码点。 Java中的int始终是一个带符号的32位整数。所以,如果你想要一个像表示字符串的内容字符数组一个C,你应该使用char[][]

要将List<String>的内容转换成二维数组,你可以使用下面的代码:

char[][] twoDarray = new char[textFile.size()]; 
for(int i = 0; i < textFile.size(); i+) 
{ 
    twoDarray[i] = textFile.get(i).toCharArray(); 
} 

数组twoDarray包含所有的字符串,每个字符串都是char数组。

+0

的空间将被放入数组 – GETah

+0

我没有看到这是行不通的空间问题。如果原始字符串包含空格,则char [] []保留这些空格的行为意味着,空格仅仅是一个特殊用途的字符。 –

+0

不,PO想要直接得到整数。解析空格字符将导致数字格式异常 – GETah

0

假设数据文件包含要解析成整数ASCII代表的数字:

11 -9 13 
12 55 102 
1 1 1024 

然后你可以使用Integer(String s)构造解析你的字符串对象。

此外,我建议分裂每一行只有一次。对于小型数组来说不会有太大影响,但是您的投入越大,您将越不必要地重新计算分组。

的(另)重写:

int tmp[][] = new int [rows][cols]; 
for(int i=0;i<rows;i++){ 
    splitarray = textFile.get(i).split(" "); 
    for(int j=0;j<cols;j++){ 
     tmp[i][j] = Integer(splitarray[j]); 
    } 
} 
1

这条线将不会编译

splitarray[j] = textFile.get(i).split(" "); 

作为splitarray[j]String类型和split的返回的数组String小号

请改为:

for(int row=0;row<textFile.size();row++){ 
     String[] splitarray = textFile.get(row).split(" "); 
     for(int col=0;col<splitarray.length;col++){ 
      tmp[row][col] = Integer.parse(splitarray[col]); 
     } 
    } 
+0

是的,我看到了错误,我将尝试解析方法,但我只看到它与对象数组完成,所以不知道该怎么做。谢谢 –