このイントロレベルの割り当てでは、ファイルとdouble[][]
から2D多次元配列を設定し、それらにいくつかのメソッドを適用する必要があります。今のところ、私は主に配列を初期化するだけです。私はテストファイルを取る方法を見つけようとしています。行の数として最初のintを、行ごとの列の数として各行の最初の整数を、配列のメンバーとしてそれぞれdoubleを読み取ります。Java 2D配列。ファイル入力からの可変行と列の長さ
2 4.1 8.9
5 9.5 2.0 7.3 2.1 8.9
:
public class MDArray { static int rowCount; static int columnCount; private static double[][] mdarray = new double[rowCount][columnCount]; public MDArray(double[][] a) { mdarray = a; } public MDArray(String file) { Scanner input = null; try { input = new Scanner(new FileInputStream("ragged.txt")); } catch (FileNotFoundException e) { System.out.println("File Not Found."); System.exit(0); } while(input.hasNextDouble()) { rowCount = input.nextInt(); for(int i = 0; i < rowCount; i++) { columnCount = input.nextInt(); for(int j = 0; j < columnCount; j++) { double value = input.nextDouble(); mdarray[i][j] = value; } } } } public static boolean isRagged() { for(int i = 0; i < mdarray.length; i++) { int rowLength1 = mdarray.length; for(int j = i + 1; j < mdarray.length; j++) { int rowLength2 = mdarray.length; if(rowLength1 != rowLength2) { return true; } } } return false; } public static int getNumberOfRows() { int numRows = 0; for(int i = 0; i < mdarray.length; i++) { numRows++; } return numRows; } public static int getNumberOfCols() { int numCols = 0; for(int i = 0, j = i + 1; i < mdarray.length; i++) { for(int k = 0; k < mdarray[i].length; k++) { if(mdarray[i].length > mdarray[j].length) { numCols++; } } } return numCols; } public static double getValAt(int i, int j) { if(i > mdarray.length || j > mdarray[i].length) { double invalid = Double.NaN; return invalid; } double valAt = mdarray[i][j]; return valAt; } public static void sort(boolean byColumn) { if(isRagged() == true) { System.out.println("Ragged arrays cannot be sorted by column."); } else{ for(int i = 0; i < mdarray.length; i++) { for(int j = 0; j < mdarray[i].length; j++) { for(int k = j + 1; k < mdarray[i].length; k++) { if(mdarray[i][j] < mdarray[i][k]) { double temp = mdarray[i][j]; mdarray[i][k] = mdarray[i][j]; mdarray[i][j] = temp; } } } } } } public static int hamming(boolean byColumn) { int hamVal = 0; if(isRagged() == true) { System.out.println("Ragged arrays cannot be sorted by column."); } else{ for(int i = 0; i < mdarray.length; i++) { for(int j = 0; j < mdarray[i].length; j++) { for(int k = j + 1; k < mdarray[i].length; k++) { if(mdarray[i][j] < mdarray[i][k]) { double temp = mdarray[i][j]; mdarray[i][k] = mdarray[i][j]; mdarray[i][j] = temp; hamVal++; } } } } } return hamVal; } public static double[] max() { double[] maxVal = new double[mdarray.length]; for(int i = 0, j = i + 1; i < maxVal.length; i++) { for(int k = 0; k < mdarray[i].length; k++) { if(mdarray[i][k] > mdarray[j][k]) { maxVal = mdarray[i]; } } } return maxVal; } public String toString() { String arrayString = ""; for(int i = 0; i < mdarray.length; i++) { for(int j = 0; j < mdarray[i].length; j++) { arrayString += ", " + mdarray[i][j]; } arrayString = arrayString + "/n"; } return arrayString; } }
これが有するファイルI MDArray(文字列ファイル)をテストしました3 1.3 5.2 3.4
私は問題は、rowCount
とcolumnCount
の整数は初期化されていないと思いますが、基本的な配列スキルで可変長に初期化する方法がわかりません。これは他のコンストラクタにも影響します。イントロレベルのコースなので、私はArrayList
のようなより高度なテクニックを使うはずがありません。さらに、メソッドをテストする配列がないので、メソッドが正しいかどうかを検証することはできません。
編集:静的でないものやその他の変更をすべて変更するなど、回答に多くの提案を実装していましたが、私はまだNullPointerException
の行を取得しています私はそれがプライベートdouble[][] mdarray
、割り当て仕様で必要です。今私はそれを後のメソッドでオーバーライドできるように初期化する方法を見つけることを試みています。
通常の配列で実現する唯一の方法は、最初にll行を読み込み、列の最大番号を取得してから、配列を初期化してファイルを再度読み込むことです値を追加して空の値を0またはnullに設定するか – XtremeBaumer
ファイルを読み取っているときに配列を割り当てる必要があります。 –
ところで、すべてのフィールドが静的なのはなぜですか? –