2016-02-21 65 views
1

我得到了這個類:矩陣與ArrayList的

import java.util.*; 

public class MatrixArrayList extends AbstractMatrix { 
    private ArrayList<ArrayList<Integer>> values; 

    public MatrixArrayList(int nbl, int nbc) { 
     super(nbl, nbc); 
     values=new ArrayList<ArrayList<Integer>>(); 
    } 


    @Override 
    public int getValue(int x, int y) { 
     return values.get(x).get(y) ; 
    } 

    @Override 
    public void setValue(int x, int y, int value) { 
     values.get(x).set(y, value); 

    } 
} 

和我

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 

我想和一個ArrayList 矩陣我有W¯¯問題是: valeurs.get( x).set(y,valeur);

+0

我對這個valeurs.get(x)有個問題。set(y,valeur); – Pika

+0

你是否必須使用列表來完成此操作?二維數組的實現可能會稍微簡單一些。 –

回答

0

從代碼中不清楚哪個調用會導致異常,但很明顯,您並未初始化內部數組列表,也沒有向其中添加任何對象。

當你在構造函數初始化:

values=new ArrayList<ArrayList<Integer>>(); 

什麼你基本上做的是實例化對象values成爲大小爲0的ArrayList(沒有項目已被添加到它尚未)。

然後,如果說,你在指數0setValue,你得到的異常,因爲當你做get(x),你基本上是在大小爲0的集合做get(0) - 沒有什麼可以讓你超越你的數組的邊界。

你可能想要做的是初始化所有陣列在構造函數中:

public MatrixArrayList(int nbl, int nbc) { 
    super(nbl, nbc); 
    values=new ArrayList<ArrayList<Integer>>(nbl); 
    for (int i = 0; i < nbl; i++) { 
     values.add(new ArrayList<Integer>(nbc)); 
    } 
} 

然後你就可以訪問它們沒有問題getValuesetValue(如果你實際上超過你會得到這個異常邊界或者如果你還沒有在特定索引處設置任何值,請參見下面的註釋:)。

但請注意,由於您使用的是ArrayList對象,而不是原始int[]數組,因此數組中仍然沒有值。簡單地做new ArrayList<Integer>()或者甚至new ArrayList<Integer>(num)仍然給你一個大小爲0的列表。如果你想覆蓋你所有的基礎,你可能想要初始化你的ArrayList,或者在getValuesetValue的每個get之前執行邊界檢查。

0

new ArrayList<ArrayList<Integer>>()創建一個空列表。要使用值填充該列表,您需要致電add()

假設你要填寫矩陣nbc空值的nbl列表:

this.values = new ArrayList<>(nbl); 
for (int i = 0; i < nbl; i++) { 
    ArrayList<Integer> row = new ArrayList<>(nbc); 
    for (int j = 0; j < nbc; j++) 
     row.add(null); 
    this.values.add(row); 
} 

你也可以用0值填充它,如果你想要的。

當然,如果矩陣不能改變大小,創建一個簡單的陣列版本可能會好很多,而不是你想要創建的ArrayList版本。有矩陣

0
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.List; 

public class Shell { 
    static List<ArrayList<ArrayList<Double>>> read(String filename) { 
     ArrayList<ArrayList<Double>> A = new ArrayList<ArrayList<Double>>(); 
     ArrayList<ArrayList<Double>> B = new ArrayList<ArrayList<Double>>(); 

     String thisLine; 

     try { 
      BufferedReader br = new BufferedReader(new FileReader(filename)); 

      // Begin reading A 
      while ((thisLine = br.readLine()) != null) { 
       if (thisLine.trim().equals("")) { 
        break; 
       } else { 
        ArrayList<Double> line = new ArrayList<Double>(); 
        String[] lineArray = thisLine.split("\t"); 
        for (String number : lineArray) { 
         line.add((double) Integer.parseInt(number)); 
        } 
        A.add(line); 
       } 
      } 

      // Begin reading B 
      while ((thisLine = br.readLine()) != null) { 
       ArrayList<Double> line = new ArrayList<Double>(); 
       String[] lineArray = thisLine.split("\t"); 
       for (String number : lineArray) { 
        line.add((double) Integer.parseInt(number)); 
       } 
       B.add(line); 
      } 
     } catch (IOException e) { 
      System.err.println("Error: " + e); 
     } 

     List<ArrayList<ArrayList<Double>>> res = new LinkedList<ArrayList<ArrayList<Double>>>(); 
     res.add(A); 
     res.add(B); 
     return res; 
    } 

    static int[][] ijkAlgorithm(ArrayList<ArrayList<Integer>> A, 
      ArrayList<ArrayList<Integer>> B) { 
     int n = A.size(); 

     // initialise C 
     int[][] C = new int[n][n]; 

     for (int i = 0; i < n; i++) { 
      for (int j = 0; j < n; j++) { 
       for (int k = 0; k < n; k++) { 
        C[i][j] += A.get(i).get(k) * B.get(k).get(j); 
       } 
      } 
     } 
     return C; 
    } 

    static void printMatrix(Matrix matrix, int n) { 
     for (int i = 0; i < n; i++) { 
      StringBuilder sb = new StringBuilder(matrix.length); 
      for (int j = 0; j < n; j++) { 
       if (j != 0) { 
        sb.append("\t"); 
       } 
       String formattedString = String.format("%.0f", matrix.get(i, j)) 
       sb.append(formattedString); 
      } 
      System.out.println(sb.toString()); 
     } 
    } 

    public static void main(String[] args) { 
     String filename; 
     if (args.length < 2) { 
      filename = "2000.in"; 
     } else { 
      filename = args[1]; 
     } 
     List<ArrayList<ArrayList<Double>>> matrices = read(filename); 
     ArrayList<ArrayList<Double>> A = matrices.get(0); 
     ArrayList<ArrayList<Double>> B = matrices.get(1); 
     int n = A.size(); 
     double[][] Aarray = new double[n][n]; 
     double[][] Barray = new double[n][n]; 
     for (int i = 0; i < n; i++) { 
      for (int j = 0; j < n; j++) { 
       Aarray[i][j] = A.get(i).get(j); 
       Barray[i][j] = B.get(i).get(j); 
      } 
     } 
     Matrix AM = new Matrix(Aarray); 
     Matrix BM = new Matrix(Aarray); 
     Matrix CM = AM.times(BM); 

     printMatrix(CM, n); 
    } 

} 

輸入文件要做到這一點操作

希望這個代碼可以幫助編碼快樂。

+1

你能解釋一下代碼如何用於OP? –

+0

我已經包含打印方法在代碼 – SmashCode

+0

我給延遲的答覆,由於淨緩慢請不要介意 – SmashCode