【问题标题】:Matrix with ArrayList带有 ArrayList 的矩阵
【发布时间】:2016-02-21 13:26:31
【问题描述】:

我上了这门课:

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 制作一个矩阵 我有这个问题: valeurs.get(x).set(y, valeur);

【问题讨论】:

  • 我对这个 valeurs.get(x).set(y, valeur) 有疑问;
  • 您必须对列表执行此操作吗?二维数组的实现可能会更简单一些。

标签: java matrix arraylist


【解决方案1】:

从您的代码中不清楚是哪个调用导致了异常,但是很明显您没有初始化内部数组列表,也没有向其中添加任何对象。

当你在构造函数中初始化它时:

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

您基本上所做的是将values 对象实例化为大小为 0 的 ArrayList(尚未向其中添加任何项目)。

然后,如果说,您在索引 0 处执行 setValue,则会出现异常,因为当您执行 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&lt;Integer&gt;() 甚至new ArrayList&lt;Integer&gt;(num) 仍然会给你一个大小为0的列表。如果你想覆盖你所有的基地,你可能想要初始化你的ArrayList,或者在你进入每个get之前执行边界检查getValuesetValue

【讨论】:

    【解决方案2】:

    new ArrayList&lt;ArrayList&lt;Integer&gt;&gt;() 创建一个空列表。要使用值填充该列表,您需要调用 add()

    假设您想用nblnbc 空值列表填充矩阵:

    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 版本。

    【讨论】:

      【解决方案3】:
      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);
          }
      
      }
      

      具有要执行此操作的矩阵的输入文件

      希望这段代码有助于愉快的编码。

      【讨论】:

      • 您能解释一下代码对 OP 有何用处吗?
      • 我没有更好地输入矩阵元素,所以我在这里使用文件概念,如果你有任何问题,你可以用矩阵元素初始化 arraylist
      猜你喜欢
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2017-08-18
      相关资源
      最近更新 更多