多次元オブジェクト配列から 2 次元の double 配列を埋める際に問題が発生しています。私の問題は、null 値が を引き起こしていることでありjava.lang.NullPointerException
at IOControl.ReadCSV$1.compare(ReadCSV.java:328)
at IOControl.ReadCSV$1.compare(ReadCSV.java:1)
at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at IOControl.ReadCSV.run(ReadCSV.java:324)
at en.window.Main.main(Main.java:46)
、その理由が本当にわかりません。
私は何をやっている ?
私はCSVファイルを読んでいます。入力を行ごとに、オブジェクトの配列に保存していData
ますcontent
. 次に、格納したい、配列に格納されている double 値であるというdouble
2 次元配列を埋めています。sortedOutput
LeftSpeed
NormAvgPowOutput
Data
私が欲しいもの:
私のsortedOutput
二次元配列を次元0の最小値から最大値にソートするには:変数の場合LeftSpeed
。
では、どうすればヌル値を回避できますか? 2 番目の配列を埋めているときにそれらを見つけようとすると、コンパイラは double をnull
値と比較できないと言うからです。
長い投稿で申し訳ありませんが、皆さんが私を助けてくれることを願っています:)ここに私のコード:
public void run(String path, int length)
{
/*
* Main function of ReadCSV class.
* Open / reads / closes the file.
* Fills the object.
*/
BufferedReader br = null;
String input = "";
String cvsSplitBy = ",";
int[] pos = new int[200];
Data[] content = new Data[length];
Double[][] sortedOutput = new Double[length][4];
int i = 0;
int j = 0;
int k = 0;
try
{
br = new BufferedReader(new FileReader(path));
while ((input = br.readLine()) != null)
{
// use comma as separator
String[] lines = input.split(cvsSplitBy);
content[i] = new Data();
if (i == 0)
{
//not relevant here
}
else
{
j = 0;
content[i].setTime("TIME", getTime(pos[j++], lines));
content[i].setData("DATA", getContent(pos[j++], lines));
//etc
}
// gets rid of non coherent or useless values, e.g negative power, ...
if (content[i].lhWdStdev > 0 && content[i].rhWdStdev > 0)
{
normalizeData(content[i]); // not relevant
content[k].setLeftSpeed();
sortedOutput[k][0] = content[k].getLeftSpeed();
sortedOutput[k][2] = content[k].getNormAvgPowOutput();
Arrays.sort(sortedOutput, new java.util.Comparator<Double[]>()
{
public int compare(Double[]a, Double[]b)
{
return Double.compare(a[0], b[0]);
}
});
}
if (sortedOutput[k][0] == null)
{
System.out.println("FAIL");
}
System.out.println("Output = " +sortedOutput[k][0]);
i++;
k++;
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
// Again it's not relevant
}
編集:最後に私は2つの大きな間違いを犯しました。最初に、ループ内で配列をソートしようとしました。つまり、配列が完全に満たされる前に (@Ted Hopp に感謝)。null
第二に、値を正しく処理しませんでした。a != null
if ( , b != null
, a[0] != null
, )をチェックしてb[0] != null
から、新しい注文を返す必要がありました。(@jboiに感謝)。