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