Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带阵列列表的矩阵_Java_Matrix_Arraylist - Fatal编程技术网

Java 带阵列列表的矩阵

Java 带阵列列表的矩阵,java,matrix,arraylist,Java,Matrix,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<

我上了这门课:

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);

    }   
}
我想用
ArrayList
我对此有疑问:
获取(x)集合(y,valeur)

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

在构造函数中初始化时:

values=new ArrayList<ArrayList<Integer>>(); 
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));
    }
}
然后,您可以在
getValue
setValue
中毫无问题地访问它们(如果您确实超出了界限,或者尚未在特定索引中设置任何值,则会出现此异常。请参阅下面的注释:)


但是请注意,由于使用的是
ArrayList
对象,而不是基元
int[]
数组,因此数组中仍然没有值。只需执行
new ArrayList()
甚至
new ArrayList(num)
操作,仍然会留下一个大小为0的列表。如果要覆盖所有基础,可能需要初始化ArrayList,或者在
getValue
setValue
中进行的每个
get
之前执行边界检查。代码中不清楚是哪个调用导致了异常,但是,很明显,您没有初始化内部数组列表,也没有向其中添加任何对象

在构造函数中初始化时:

values=new ArrayList<ArrayList<Integer>>(); 
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));
    }
}
然后,您可以在
getValue
setValue
中毫无问题地访问它们(如果您确实超出了界限,或者尚未在特定索引中设置任何值,则会出现此异常。请参阅下面的注释:)

但是请注意,由于使用的是
ArrayList
对象,而不是基元
int[]
数组,因此数组中仍然没有值。只需执行
new ArrayList()
甚至
new ArrayList(num)
操作,仍然会留下一个大小为0的列表。如果要覆盖所有基础,可能需要初始化ArrayList,或者在
getValue
setValue
中创建的每个
get
之前执行边界检查,以创建空列表。要用值填充该列表,需要调用
add()

假设您想用
nbl
列表的
nbc
空值填充矩阵:

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);
}
this.values=新的ArrayList(nbl);
对于(int i=0;i
如果需要,还可以用
0
值填充它

当然,如果矩阵无法更改大小,那么最好创建一个简单的数组版本,而不是尝试创建的
ArrayList
版本。

新建ArrayList()
创建一个空列表。要用值填充该列表,需要调用
add()

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);
    }

}
假设您想用
nbl
列表的
nbc
空值填充矩阵:

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);
}
this.values=新的ArrayList(nbl);
对于(int i=0;i
如果需要,还可以用
0
值填充它

当然,如果矩阵无法更改大小,那么最好创建一个简单的数组版本,而不是尝试创建的
ArrayList
版本;
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);
    }

}
导入java.io.FileReader; 导入java.io.IOException; 导入java.util.ArrayList; 导入java.util.LinkedList; 导入java.util.List; 公共类外壳{ 静态列表读取(字符串文件名){ ArrayList A=新的ArrayList(); ArrayList B=新的ArrayList(); 把这条线串起来; 试一试{ BufferedReader br=新的BufferedReader(新文件读取器(文件名)); //开始读一本书 而((thisLine=br.readLine())!=null){ if(thisLine.trim()等于(“”){ 打破 }否则{ ArrayList行=新的ArrayList(); String[]lineArray=thisLine.split(“\t”); 用于(字符串编号:lineArray){ add((双精度)Integer.parseInt(number)); } A.添加(行); } } //开始读B 而((thisLine=br.readLine())!=null){ ArrayList行=新的ArrayList(); String[]lineArray=thisLine.split(“\t”); 用于(字符串编号:lineArray){ add((双精度)Integer.parseInt(number)); } B.添加(行); } }捕获(IOE异常){ System.err.println(“错误:+e”); } List res=new LinkedList(); 增加(A)项决议; 增加(B)项决议; 返回res; } 静态int[]ijkAlgorithm(数组列表A, 阵列列表B){ int n=A.size(); //初始化C int[][]C=新的int[n][n]; 对于(int i=0;i